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是字典的形式。