requests爬取网页的通用框架
概述
代码编写完成时间:2017.12.28
写文章时间:2017.12.29
看完中国大学MOOC上的爬虫教程后,觉得自己之前的学习完全是野蛮生长,决定把之前学的东西再梳理一遍,主要是觉得自己写的程序和老师写的差别太大,有很多学习的地方,决定用老师所教的和自己已有的知识融合,形成新的知识。
爬虫的第一步当然获取到网页,所以可以专门写一个程序来获取网页,以后对此进行不断改进就行,不必重复制造轮子。
准备
此程序用到的库主要是requests库,还有现在的网站一般都有反爬虫措施,最常见的是检查浏览器的头部信息,所以对头部信息进行伪装的操作可以说是很必要的,为此可以引入fake_useragent库,引入:
from fake_useragent import UserAgent
import requests
编写
对爬取网页代码的编写,一般都用requests的get方法对网页进行访问,对于get方法,为了反爬虫和良好的体验,可以增加一些参数来增加约束:
response = requests.get(url, headers=headers, timeout=10)
发现对百度首页的爬取增不增加头部信息返回的内容是不一样的,增加了之后可以明显看到返回的内容变多和排版更加人性化。
然后要返回text属性所包含的内容,还有一个很重要的网页编码问题,如果编码设置的不对,那么返回的text可能是乱码,因为现在国际上一般都使用UTF-8编码,所以我直接令网页的编码为UTF-8:
response.encoding = 'utf-8'
其实按照老师的写法是这样的:
response.encoding = response.apparent_encoding
但这样每次都要根据网页的源代码对编码进行判断,无疑是要花费一点时间的,干脆使用UTF-8这个万金油省事,反正requests一般都是用来爬取单个网站的内容,编码不对再改就行了,没什么大不了的。
现在基本上能完成对静态网页的访问并返回源代码了。
优化
没看视频之前,我就是写到上面那一步之后就收工了,因为完成了基本功能嘛,但是通过和老师的学习,我知道这样使不行的,因为这样的代码不够健壮,出错了就直接崩溃,现在代码量少没有关系,但是以后代码量大了,就会有很大的麻烦,所以这是非常不好的习惯,好的程序应该有良好的对异常处理功能,然后我引入可能发生的异常:
from requests import Timeout, HTTPError
Timeout是可能请求超时的异常,因为校园网不稳定,这种情况是十分常见的;HTTPError是请求HTTP页面的时候可能发生的异常,比如常见的404错误。
下面是改进的代码:
from fake_useragent import UserAgent
import requests
from requests import Timeout, HTTPError
ua = UserAgent() #能够获得浏览器种类信息的实例
def get_page(url):
try:
headers = {'User-Agent':ua.random} #随机获得头部信息
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
response.encoding = 'utf-8'
return response.text
except Timeout:
print('requests timeout')
get_page(url)
except HTTPError:
print('the http error(maybe status is not 200)')
except:
print('other error')
url = 'https://www.baidu.com/'
html = get_page(url)
print(html)
通过上述代码,除了捕获引入的两个异常外,为了保险起见,把其他的所有异常就统一进行了处理,对于超时异常,就递归调用,重新访问;还有对返回的response增加了一行代码判断:
response.raise_for_status()
作用是如果返回的状态码不是正常的200,就抛出HTTP错误。
一些网页不能正常访问也返回200状态码,真是有毒,这个有点无解,目前除了人工判断,还没有其他办法。
总结
一个简单的获取网页的框架的代码已经完成了,虽然比较“寒酸”,但基本功能也有了,也有对一些异常的处理,健壮性提升了一点,直觉上觉得还有许多不足,但是我相信,随着不断地进步,此程序就可以变得更加完善的。
requests爬取网页的通用框架的更多相关文章
- python爬取网页的通用代码框架
python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...
- Requests爬取网页的编码问题
Requests爬取网页的编码问题 import requests from requests import exceptions def getHtml(): try: r=requests.get ...
- python(27)requests 爬取网页乱码,解决方法
最近遇到爬取网页乱码的情况,找了好久找到了种解决的办法: html = requests.get(url,headers = head) html.apparent_encoding html.enc ...
- 一起学爬虫——使用Beautiful Soup爬取网页
要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful Soup并通过一个例子来实现如何使用Beautiful Soup ...
- python requests库爬取网页小实例:爬取网页图片
爬取网页图片: #网络图片爬取 import requests import os root="C://Users//Lenovo//Desktop//" #以原文件名作为保存的文 ...
- Python使用requests爬取一个网页并保存
#导入 requests模块import requests #设置请求头,让网站监测是浏览器 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6. ...
- Python使用urllib,urllib3,requests库+beautifulsoup爬取网页
Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...
- 爬虫-----selenium模块自动爬取网页资源
selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. sel ...
- requests爬取百度音乐
使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来. 首先进行url分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...
随机推荐
- 微信官方团队放出了UI库,看来以后前端还要学WeChatUI了,哈哈
已经在github上发布,网址如下:https://github.com/weui/weui
- redis在Linux上的安装和简单使用
一.官方文档介绍方式 这里演示的版本是Redis4.0.6,Linux系统是CentOS6.7,Jdk1.7,Jedis2.8.1 下载,解压,编译: $ wget http://download.r ...
- Pyhton爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗
Pyhton爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗 零.致谢 感谢BOSS直聘相对权威的招聘信息,使本人有了这次比较有意思的研究之旅. 由于爬虫持续爬取 www.zhipin.com 网 ...
- C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...
- 我理解的malloc()和free()。
关于malloc和free这两个函数,malloc的使用方法演示样例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一 ...
- Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)
上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...
- IIS 服务或万维网公布服务,或者依赖这 服务可能在启动期间错误发生或者已禁用
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 详细错误信息例如以下: 解决方式: 在服务中禁用下面3个服务自己主动启动: Net.Msmq Li ...
- ME01:猎场中猎头的内核
前几天追了下<猎场>,只看了前面10多集,觉得下面的对话有点意思. 是关于猎头是干什么的? 猎头具备的素质. 对我们普通人是不是也有启发意义呢? 如何看人, 找到靠谱的合作人?找打好的老板 ...
- 工厂方法模式的一些思考(java语法表示)
同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就 ...
- 自学Python5.4-内置模块(2)
内置模块(2) 7. xml8.conf9.requests10.logging11.paramiko12.time & datetime 时间相关的操作,时间主要分三种表示方式: 时间戳 ...