2.2 数据抓取实践
2.2.1 请求网页数据
1.发起请求
先看下面这段代码。
import requests url = 'http://www.douban.com' data = requests.get(url) print(data.text)
运行输出如下(截取部分)。
<! DOCTYPE HTML> <html lang="zh-cms-Hans" class=""> <head> <meta charset="UTF-8"> <meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和价格比较,以 及城市独特的文化生活。"> <meta name="keywords" content="豆瓣,广播,登录豆瓣"> <meta property="qc:admins" content="2554215131764752166375" /> <meta property="wb:webmaster" content="375d4a17a4fa24c2" /> <meta name="mobile-agent" content="format=html5; url=https://m.douban.com"> <title>豆瓣</title>
下面进行简要说明。
●import requests
调入需要的库requests。
●url = 'http://www.douban.com'
将变量url赋值为豆瓣的网址。
●data = requests.get(url)
利用requests库的get方法,向此URL(即豆瓣首页)发起请求,并将服务器返回的内容存入变量data。
●print(data.text)
打印服务器返回的内容。从打印内容来看,已经请求成功。
注意:这里使用requests.get请求网页数据,涉及向网站提交表单数据的时候,如登录豆瓣等网站,我们还会用到post方法,这个之后还会介绍。
至此,发起请求的部分已经完成一大部分了。为什么不是全部呢?细心的读者已经发现,这里并没有设置UA进行伪装,但是仍然得到了网页内容。但是在有些情况下,不设置UA会出现错误。
2.设置UA进行伪装
那么,如何设置UA进行伪装呢?这里介绍一个网址,http://httpbin.org/get,它会返回一些关于请求头的信息。下面是笔者访问时返回的内容。
{ "args": {}, "headers": { "Accept": "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q= 0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-US, en; q=0.5", "Connection": "close", "Host": "httpbin.org", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20 100101 Firefox/52.0" }, "origin": "45.77.19.213", "url": "http://httpbin.org/get" }
可以看到返回的UA如下。
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
下面仍然利用之前的请求代码,只是地址改为这个网址,再次查看UA。
import requests url = 'http://httpbin.org/get' data = requests.get(url) print(data.text)
运行输出如下。
{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "origin": "113.58.87.225", "url": "http://httpbin.org/get" }
此时UA如下所示。
"User-Agent" : "python-requests/2.9.1"
显然,在没有UA的伪装下,服务器很容易就能识别出对方是一只网络爬虫的,所以有些网站在发现请求来自网络爬虫时将直接拒绝请求。为了伪装,可以通过下面的方式设置UA的伪装。
import requests url = 'http://httpbin.org/get' # headers里面大小写均可 headers = {'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) G ecko/20100101 Firefox/52.0"} data = requests.get(url, headers=headers) print(data.text)
运行输出如下。
{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20 100101 Firefox/52.0" }, "origin": "113.58.87.225", "url": "http://httpbin.org/get" }
可以看到,此时的UA和用浏览器请求的UA是一样的,说明已经伪装成功。而UA的获取也十分简单,在任意网页空白处单击鼠标右键→选择“检查元素”→选择“Network”选项→选中一个请求(没有则刷新网页)→选择右侧“Header”选项,可以看到下方UA,如图2-2所示。
图2-2
至此,已经能够完成网页的请求,并进行简单的伪装了!
注意:这里通过设置headers,并以参数形式传入requests的get函数进行伪装。headers是字典的形式。