上一篇文中我们用到了Python的几个模块做了百度新闻的爬取,这些模块他们在爬虫中的作用如下:
1、requests模块
它用来做http网络请求,下载URL内容,相比Python自带的urllib.request,requests更加易用。GET,POST信手拈来:
import requests
res = requests.get(url, timeout=5, headers=my_headers)
res2 = requests.post(url, data=post_data, timeout=5, headers=my_headers)
get()和post()函数有很多参数可选,上面用到了设置timeout,自定义headers,更多参数可参考requests 文档。
requests无论get()还是post()都会返回一个Response对象,下载到的内容就通过这个对象获取:
res.content 是得到的二进制内容,其类型是bytes;
res.text 是二进制内容content decode后的str内容;
它先从response headers里面找到encoding,没找到就通过chardet自动判断得到encoding,并赋值给res.encoding,最后把二进制的content解密为str类型。
经验之谈: res.text判断中文编码时有时候会出错,还是自己通过cchardet(用C语言实现的chardet)获取更准确。这里,我们列举一个例子:
In [1]: import requests
In [2]: r = requests.get('http://epaper.sxrb.com/')
In [3]: r.encoding
Out[3]: 'ISO-8859-1'
In [4]: import chardet
In [5]: chardet.detect(r.content)
Out[5]: {'confidence': 0.99, 'encoding': 'utf-8', 'language': ''}
上面是用ipython交互式解释器(强烈推荐ipython,比Python自己的解释器好太多)演示了一下。打开的网址是山西日报数字报,手动查看网页源码其编码是utf8,用chardet判断得到的也是utf8。而requests自己判断的encoding是ISO-8859-1,那么它返回的text的中文也就会是乱码。
requests还有个好用的就是Session,它部分类似浏览器,保存了cookies,在后面需要登录和与cookies相关的爬虫都可以用它的session来实现。
2、re模块
正则表达式主要是用来提取html中的相关内容,比如本例中的链接提取。更复杂的html内容提取,推荐使用lxml来实现。
3、tldextract模块
这是个第三方模块,需要pip install tldextract进行安装。它的意思就是Top Level Domain extract,即顶级域名提取。前面我们讲过URL的结构,news.baidu.com 里面的news.baidu.com叫做host,它是注册域名baidu.com的子域名,而com就是顶级域名TLD。它的结果是这样的:
In [6]: import tldextract
In [7]: tldextract.extract('http://news.baidu.com/')
Out[7]: ExtractResult(subdomain='news', domain='baidu', suffix='com')
返回结构包含三部分:subdomain, domain, suffix
4、time模块
时间,是我们在程序中经常用到的概念,比如,在循环中停顿一段时间,获取当前的时间戳等。而time模块就是提供时间相关功能的模块。同时还有另外一个模块datetime也是时间相关的,可以根据情况适当选择来用。
记住这几个模块,在今后的写爬虫生涯中将会受益匪浅。
标签:baidu,知识点,encoding,Python,爬虫,headers,模块,requests,com From: https://blog.51cto.com/u_13488918/5987019