抓取网页生成电子书(用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')

  

  成功!

  至此我们已经获得了整个页面的完整信息。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线