python爬虫urllib使用和进阶
上节课已经介绍了爬虫的基本概念和基础内容,接下来就要开始内容的爬取了。
其实爬虫就是浏览器,只不过它是一个特殊的浏览器。爬取网页就是通过HTTP协议访问相应的网页,不过通过浏览器访问往往是人的行为,把这种行为变成使用程序来访问就是爬虫的过程。
用户在使用浏览器的时候,翻阅速度是比较慢的,但是爬虫在访问的时候速度是很快的,它会很快的获取到页面上的内容,并将其变成自己网站的内容,所以对于开发者来讲,对于这些搜索引擎的爬虫是又爱又恨的。
有的网站会设置反爬虫策略来拒绝爬虫对网站内容的爬取要求。此时我们要爬取这种网站的话,是要对程序进行包装的,尽量去模拟人的行为来获取网站内容。
urllib包
urllib是Python提供的一个工具包,用来处理url和相应的一些内容的。
Python 2中提供了urllib和urllib 2。urllib提供较为底层的接口, urllib2对urllib进行了进一步封装。
Python 3中将urllib合并到了urllib 2中, 并只提供了标准库urllib包。我们重点使用的是Python3,但是它们的接口都是相同的,掌握了就可以在任何场景使用。
urllib还有一些子包,分别介绍下:
urllib.request模块(用的比较多)
用于打开和读写url。模块定义了在基本和摘要式身份验证、重定向、cookies等应用中打开URL(主要是HTTP)的函数和类。
- urllib.error 包含了由urllib.request引起的异常
- urllib.parse 用于解析url
- urllib.robot parser 分析robots.txt文件
urlopen方法
格式:url open(url, data=None)
注释:url是链接地址字符串, 或请求对象。
data是提交的数据, 如果data为None发起GET请求, 否则发起POST请求。见urllib.request.Request#get_method
返回http.client.HTTPResponse
类的响应对象, 这是一个类文件对象。
接下来看一段代码:
验证其中的“返回真正的URL”:打开http://www.bing.com 按下F12 打开其中的Network状态栏,点击刷新:
可以看到第一个访问的是必应网站,这里的301代表的意思是,首先打开必应的网站,然后通过持久的移动到中国的必应网站;
这里的location是跳转位置,301代表永久的跳转,302 代表的是临时的跳转;
代码运行结果:
可以发现,urlopen是可以自动跳转的。
总结:
上例, 通过urllib.request.url open方法, 发起一个HTTP的GET请求, WEB服务器返回了网页内容。响应的数据被封装到类文件对象中, 可以通过read方法、readline方法、read lines方法获取数据, status和reason属性表示返回的状态码, info方法返回头信息, 等等。
User-Agent问题
上例的代码非常精简, 即可以获得网站的响应数据。url open方法只能传递url和data这样的数据, 不能构造HTTP的请求。例如useragent。
源码中构造的useragent如下:
当前显示为:Python-urllib/3.6
有些网站是反爬虫的,所以要把爬虫伪装成浏览器。随便打开一个浏览器,复制浏览器的UA值,进行伪装。
UA值获取方法:
打开浏览器的设置。选择高级,选择自定义UserAgent字符串,随意切换想要的UA值。
这里演示的是使用Chrome的ua值:
通过UA值的伪装,就可以告诉别人,“我是一个浏览器”,那么UA值该如何使用呢?这里就要用到request类:
Request类
首先它会有一个header,在这里记录了一些基本的信息:
还要有一个User-agent,这里是一些版本的要求,以及对能接受的浏览器版本、CSS样式等信息的描述:
有了以上两个参数,就可以构建一个request请求了。
接下来就是对request的使用实战演示:
运行结果为:
总结:
格式:Request(url, data=None, headers=() )
要在发起请求之前将内容填充完毕!
初始化方法, 构造一个请求对象。可添加一个header的字典。data参数决定是GET还是POST请求。add_header(key, val) 为header中增加一个键值对。
接下来看一个示例:
from urllib.request import Request, url open
import random#随机函数,用来随机UA值
#打开一个url返回一个Request请求对象
#url='https://movie.douban.com/'#注意尾部的斜杠一定要有
url='http://www.bing.com/'
ua_list=[#包含UA值的List,不停地切换地址,保证不被发现是爬虫
”Mozilla/5.0(WindowsNT I 6.1; Win 64; x 64) Apple WebKit/537.36(KHTML, like Gecko)Chrome /57.0.2987. 133 Safari/537.36”, #chrome
”Mozilla/5.0(Windows; U; WindowsNT 6.1; zh-CN) Apple webKit/537.36(KHTML, like Gecko)Version /5.0. 1 Safari/537.36”, #safa fi
”Mozilla/5.0(WindowsNT 6.1; Win 64; x 64; rv:50. 0) Gecko/ 20100101 Firefox/50.0”, #Firefox“Mozilla/5.0(compatible; MSIE 9.0; WindowsNT 6.1; Trident/5.0) ”#IE
ua=random.choice(ua_list) #随机一个UA值
#ua需要加到请求头中
request=Request(url)
request.add_header('User-Agent', random.choice(ua_list) )
print(type(request) )
response=url open(request, timeout=20) #request对象或者url都可以
print(type(response) )
with response:
print(1, response.status, response.get code() , response.reason)#状态, get code本质上就是返回
status
print(2, response.geturl() )#返回数据的url。如果重定向, 这个url和原始url不一样
# 例如原始url是http://www.bing.com/, 返回http://cn.bing.com/
print(3, response.info() )#返回响应头headers
print(4, response.read() )#读取返回的内容
print(5, request.get_header('User-agent') )
print(6,'user-agent'.capitalize() )
执行结果为:
到这里就完成了对User-agent的修改,同时也学会了request和urlopen的使用方式。
上述的简单代码是学习爬虫的第一步,就算以后在开发中会用到框架,但是还是从基本内容出发的,希望同学们可以多加了解!
点击查看配套视频课程
获取更多内容,请订阅 Python学习站 官方技术圈!