抓取网页生成电子书(用urllib2的Request类构建一个request接下来获取响应页面内容)
优采云 发布时间: 2021-10-08 19:31抓取网页生成电子书(用urllib2的Request类构建一个request接下来获取响应页面内容)
使用 urllib2 的 Request 类构造请求
url = "https://www.qiushibaike.com/"
request = urllib2.Request(url)
接下来使用urllib2的urlopen方法请求页面并获取响应(即页面内容)
response = urllib2.urlopen(request)
打印得到的内容
print response.read()
运行我们的脚本,结果是一个错误:
Traceback (most recent call last):
File "00_get_a_page.py", line 19, in
response = urllib2.urlopen(request)
File "D:\Python27\lib\urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "D:\Python27\lib\urllib2.py", line 429, in open
response = self._open(req, data)
File "D:\Python27\lib\urllib2.py", line 447, in _open
'_open', req)
File "D:\Python27\lib\urllib2.py", line 407, in _call_chain
result = func(*args)
File "D:\Python27\lib\urllib2.py", line 1241, in https_open
context=self._context)
File "D:\Python27\lib\urllib2.py", line 1201, in do_open
r = h.getresponse(buffering=True)
File "D:\Python27\lib\httplib.py", line 1121, in getresponse
response.begin()
File "D:\Python27\lib\httplib.py", line 438, in begin
version, status, reason = self._read_status()
File "D:\Python27\lib\httplib.py", line 402, in _read_status
raise BadStatusLine(line)
httplib.BadStatusLine: ''
这是因为尴尬百科对爬虫做了一些反爬虫优化,你必须是浏览器才能访问页面。
不过没关系,浏览器的信息是通过headers实现的。我们可以使用 urllib2 设置浏览器信息头,将我们的程序伪装成浏览器。
设置头验证信息
user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER"
headers = {"User-Agent":user_agent}
可以看到我们设置了 User-Agent 字段,并将其封装为字典 headers,后面会用到。
user_agent 的内容为 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER,这是我用的猎豹浏览器的头信息,可以通过F12开发者工具查看。
重构请求并打印得到的响应页面的内容
request = urllib2.Request(url,headers=headers)
可以发现,在构造请求的时候,除了url参数,我们还把封装好的带有浏览器信息的headers传递给了urllib2.Request的headers参数。
[!] headers=headers 必须指定,否则headers会默认传给urllib2.Request的第二个参数,但是第二个参数不是headers,如下:
>>> help("urllib2.Request")
Help on class Request in urllib2:
urllib2.Request = class Request
| Methods defined here:
| __getattr__(self, attr)
| __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False)
用同样的方式重新请求页面,得到响应并打印出来
成功获得!但是我们的汉字没有出现。
这是因为我们获取的response.read()的编码方式是UTF-8字节流数据,而我们python2.7默认的编解码方式是ASCII,导致出现乱码。
我们打印的时候,指定解码方式为UTF-8,试试看。
print response.read().decode('utf-8')
成功!
至此我们已经获得了整个页面的完整信息。