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分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...
随机推荐
- chrony时间同步 服务端 客户端 安装配置
chrony时间同步 服务端 客户端 安装配置 原创内容http://www.cnblogs.com/elvi/p/7658021.html #!/bin/sh #运行环境 centos7 #chro ...
- SSH批量管理 expect自动交互
SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...
- HDU 5504 GT and sequence 模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5504 思路:模拟 代码: #include<stdio.h>//------杭电5504 ...
- ZBX_NOTSUPPORTED: Item does not allow parameters.
搞mongo监控的时候,zabbix报错:ZBX_NOTSUPPORTED: Item does not allow parameters. 想了半天,不知道原因,最后经过大神指点,原来是zabb ...
- 通过ssh訪问NAT网络模式虚拟机里的Linux
进入 GuestOS : #/sbin/ifconfig 查看 inet addr : 10.0.2.15 然后到 HostOS 去, 看控制面板, 看网络和共享中心的VirtualBox Host- ...
- UVA 1426 - Discrete Square Roots(数论)
UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...
- [数字图像处理]常见噪声的分类与Matlab实现
1.研究噪声特性的必要性 本文的内容主要介绍了常见噪声的分类与其特性. 将噪声建模,然后用模型去实现各式各样的噪声. 实际生活中的各种照片的老化,都能够归结为下面老化模型. 这个模型非常easy,也能 ...
- Woody的Python学习笔记1
Python 是一种解释性语言:这意味着开发过程中省去了编译这个环节,类似于PHP\Perl. Python 是交互式语言:这意味着你能够在一个python提示符,直接互动运行写你的程序. Pytho ...
- Struts2学习笔记整理(三)
Struts2的输入校验 之前对请求参数的输入校验一般分为两部分:1.客户端校验,也就是我们写js代码去对客户的误操作进行过滤 2.服务端校验, 这是整个应用组织非法数据的最后防线. Struts2 ...
- HTTP Status 500 - Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement
1.什么操作出现:当我在项目中添加产品或者修改时,浏览器出现HTTP Status 500 - Request processing failed; nested exception is org.h ...