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分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...
随机推荐
- 河南省第八届ACM省赛---引水工程
引水工程 时间限制:2000 ms | 内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...
- Linux基础-最基础
Linux基础 为了更好的学习知识,开通此博客,以前博客丢了...记录一下知识点,希望能在这里与大家互相学习交流. 20171113 14:00 Linux基础-基本知识 Linux树状文件系统结构 ...
- 【WF2017】Mission Improbable
http://www.lydsy.com/JudgeOnline/problem.php?id=4950 对于俯视图很好解决,把所有不是0的位置拿到剩1就可以了. 对于正视图与侧视图,稍微想一下也能发 ...
- 数组a和&a区别
假设我们定义一个数组char a[16]; 那么a与&a分别代表什么呢?它们完全一样吗? a其实代表的是数组中首元素的地址,即a[0]的地址,&a代表的是整个数组的起始地址.我们做个测 ...
- SFTP工具类 操作服务器
package com.leadbank.oprPlatform.util;import com.jcraft.jsch.*;import com.jcraft.jsch.ChannelSftp.Ls ...
- lucene6+HanLP中文分词
1.前言 前一阵把博客换了个模版,模版提供了一个搜索按钮,这让我想起一直以来都想折腾的全文搜索技术,于是就用lucene6.2.1加上HanLP的分词插件做了这么一个模块CSearch.效果看这里:h ...
- maven jetty struts异常 There is no Action mapped for namespace [/] and action name [] associated with context path
毕业设计中用maven jetty插件调试时,struts出现这个错误,直接http://localhost:8080 无法进入默认主页,但换tomcat就没问题,最后在这篇文章找到答案 http:/ ...
- LeetCode :My solution N-Queens
N-Queens Total Accepted: 15603 Total Submissions: 60198My Submissions The n-queens puzzle is the pro ...
- hdu 5305 friends
每一次比赛的时候脑子都卡顿, 这次更离谱,我居然二进制枚举边,这么大的复杂度.而且剪不了枝 后来学长说着是道爆搜.搜每一条边.恍然大悟. 仅仅须要剪掉点的度数是奇数的时候,或者他的线上朋友或线下朋友大 ...
- Jena将owl文件持久化到数据库中
package cn.edu.shu.db; import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti ...