专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
51好读  ›  专栏  ›  马哥Linux运维

一万两千字,一眼看穿Python爬虫与网络协议

马哥Linux运维  · 公众号  · 运维  · 2019-12-25 22:09

正文

请到「今天看啥」查看全文


User-agent: *Disallow: /Disallow: /poi/detail.phpSitemap: http://www.mafengwo.cn/sitemapIndex.xml


HTTP请求和响应处理

其实爬取网页就是通过HTTP协议访问网页,不过通过浏览器反问往往是人的行为,把这种行为变成使用程序来访问。


urllib包

urllib是标准库,它一个工具包模块,包含下面模块来处理url:

* urllib.request 用于打开和读写url

* urllib.error 包含了由urllib.request引起的异常

* urllib.parse 用于解析url

* urllib.robotparser 分析robots.txt文件


Python2中提供了urllib和urllib2。 urllib提供较为底层的接口,urllib2对urllib进行了进一步封装。 Python3中将urllib合并到了urllib2中,并更名为标准库urllib包。


urllib.request模块

定义了在基本和摘要式身份验证、重定向、cookies等应用中打开Url(主要是HTTP)的函数和类。


  • urlopen方法

1.urlopen(url,data=None)

url是链接地址字符串,或请求类的实例

data提交的数据,如果data为Non发起的GET请求,否则发起POST请求。 见urllib.request.Request#get_method返回http.client.HTTPResponse类的相遇对象,这是一个类文件对象。

from urllib.request import urlopen# 打开一个url返回一个相应对象,类文件对象# 下面链接访问后会有跳转responses = urlopen("http://www.bing.com") #默认GET方法print(responses.closed)with responses:    print(1, type(responses)) # http.client.HTTPResponse类文件对象    print(2,responses.status,responses.reason) #状态    print(3,responses.geturl()) #返回真正的URL    print(4,responses.info()) #headers    print(5,responses.read()[:50]) #读取返回的内容
print(responses.closed)


1. 上例,通过urllib.request.urlopen方法,发起一个HTTP的GET请求,WEB服务器返回了网页内容。 响应的数据被封装到类文件对象中,可以通过read方法、readline方法、readlines方法获取数据,status和reason属性表示返回的状态码,info方法返回头信息,等等。


  • User-Agent问题

上例代码非常精简,即可以获得网站的响应数据。 但目前urlopen方法通过url字符串和data发起HTTP的请求。 如果想修改HTTP头,例如useragent,就的借助其他方式。


原码中构造的useragen如下:

# urllib.request.OpenerDirectorclass OpenerDirector:    def __init__(self):        client_version = "Python-urllib/%s" % __version__        self.addheaders = [('User-agent', client_version)]```* 当前显示为Python-urlib/3.7* 有些网站是反爬虫的,所以要把爬虫伪装成浏览器。顺便打开一个浏览器,复制李立群的UA值,用来伪装。


  • Request类

Request(url,data=None,headers={})

初始化方法,构造一个请求对象。 可添加一个header的字典。 data参数决定是GET还是POST请求。

obj.add_header(key,val)为header增加一个键值对。

from urllib.request import Request,urlopenimport random# 打开一个url返回一个Request请求对象# url = "https://movie.douban.com/" #注意尾部的斜杠一定要有url = "http://www.bing.com/"
ua_list = [ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", # chrome "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/537.36 (KHTML, like Gecko) Version/5.0.1 Safari/537.36", # safafi "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0", # Firefox "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" # IE]
ua = random.choice(ua_list)request = Request(url)request.add_header("User-Agent",ua)print(type(request))
response = urlopen(request,timeout=20) #request对象或者url都可以print(type(response))
with response: print(1






请到「今天看啥」查看全文