概述

代码编写完成时间: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爬取网页的通用框架的更多相关文章

  1. python爬取网页的通用代码框架

    python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...

  2. Requests爬取网页的编码问题

    Requests爬取网页的编码问题 import requests from requests import exceptions def getHtml(): try: r=requests.get ...

  3. python(27)requests 爬取网页乱码,解决方法

    最近遇到爬取网页乱码的情况,找了好久找到了种解决的办法: html = requests.get(url,headers = head) html.apparent_encoding html.enc ...

  4. 一起学爬虫——使用Beautiful Soup爬取网页

    要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful Soup并通过一个例子来实现如何使用Beautiful Soup ...

  5. python requests库爬取网页小实例:爬取网页图片

    爬取网页图片: #网络图片爬取 import requests import os root="C://Users//Lenovo//Desktop//" #以原文件名作为保存的文 ...

  6. Python使用requests爬取一个网页并保存

    #导入 requests模块import requests #设置请求头,让网站监测是浏览器 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6. ...

  7. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页

    Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...

  8. 爬虫-----selenium模块自动爬取网页资源

    selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作.     sel ...

  9. requests爬取百度音乐

    使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来. 首先进行url分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...

随机推荐

  1. RAC环境下误操作将数据文件添加到本地存储

    今天碰到个有意思的事情,有客户在Oracle RAC环境,误操作将新增的数据文件直接创建到了其中一个节点的本地存储上. 发现网上去搜的话这种问题还真不少,对应解决方案也各式各样,客户问我选择哪种方案可 ...

  2. js实现谷歌网站统计

    基本方法 function ga() { if (window.ga) { window.ga.apply(null, arguments); } else { stack.push(argument ...

  3. HDU 2686 Matrix 多线程dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 思路:多线程dp,参考51Nod 1084:http://www.51nod.com/onlin ...

  4. 关于网页授权的两种scope的区别说明

    关于网页授权的两种scope的区别说明 1.以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回 ...

  5. Tomcat 源码分析(一)——启动与生命周期组件

    写在前面的话:读Tomcat源码也有段时间了,大领悟谈不上.一些小心得记录下来,供大家参考相护学习. 一.启动流程 Tomcat启动首先需要熟悉的是它的启动流程.和初学者第一天开始写Hello Wor ...

  6. 高效管理http连接

    1.Http连接基础 Http协议承载了互联网上的主要流量,然而说到传输,还要回归到最基本的网络分层模型TCP/IP.TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交互网络分层协议集.客户 ...

  7. 如何在Raspberry Pi 3B中安装RASPBIAN

    RASPBIAN简介 RASPBIAN是树莓派官方支持的基于Debian的Linux系统.RASPBIAN预装了很多常用的组件,使用起来十分方便. 官方有RASPBIAN STRETCH WITH D ...

  8. models中的pk主键用法

    class FrontUserModel(models.Model): uid = models.UUIDField(primary_key=True,default=uuid.uuid4) emai ...

  9. VisualStudio程序运行后控制台窗口一闪就没了

    这个虽然是千查万查出来的,但也不是原创的.希望对大家有所帮助. 方案一:网上最常见的解决方案是,在程序结尾的 return 0; 之前加 system("pause") 或 get ...

  10. Cocos2d-x 3.0 Android改动APK名、更改图标、改动屏幕方向、改动版本,一些须要注意的问题

    非常多新手程序员做出一个游戏后,编译成apk安装在手机上.却发现安装程序名和游戏图标都是Cocos2dx默认的,并且默认屏幕方向是横向.那么须要怎么才干改动为自己想要的呢? 打开你创建的project ...