0%

网络数据如何获取(爬取)?抓取网页,解析网页内容

除了利用本地数据之外,因特网上每天会产生海量的数据,这些数据里面有很多有价值的内容.Python中提供了很多函数可以很方便的获取网络数据.但是 有些网页内容可能是动态生成的,比如说由js动态生成,这个时候网页的源代码就并不对应网页上显示的内容,比如说雅虎财经上道指成分股的股票数据信息,这个网站的数据经常会变化.

网络数据的获取也称为爬取,分为两个阶段 第一个是抓取,第二个是解析.
抓取我们以前常常会采用urllib这样的一个内建模块,特别是其中的request模块,它可以方便的抓取网页内容.这个模块已经逐渐被Requests第三方库代替了,它很适合做中小型网络爬虫的开发,但如果要进行大型网络爬虫的开发要用到另一个Scrapy这样一个非常流行f的开源的爬虫框架.

抓取的过程其实就是客户机发送一个请求Request给服务器,服务器会返回一个相应Response,拿到一个相应之后我们要对它进行解析,现在流行的解析工具有BeautifulSoup库和正则表达式模块,后面都会做一些介绍.除了这样的抓取和解析方式以外 有的时候我们还可以通过第三方的API来更加方便的抓取和解析网页的内容.这种方式是由第三方API已经自动把抓取过程和解析过程帮我们完成了并且会定期更新

- 抓取

- urllib内建模块
- Requests第三方库
- Scrapy框架

- 解析

- BeautifulSoup库

Requests库

  • Requests库是更简单、方便和人性化的Python、HTTP第三方库
  • Requests官网l:http://www.python-requests.org/
    基本方法 requests.get() 请求获取指定URLd位置的资源,对应HTTP协议的GET方法
    第三方库网上都会提供非常丰富的信息,基本上只要我们使用它的网站

现在我们来领略一下Requests库的魅力,

非常简单 后面带上要抓取的网页地址,就可以获得一个response对象
然后通过status—code查看状态码,如果是200就表示一切正常
再通过text属性来查看网页的内容
这几条语句是最常用的

1
2
3
4
5
6
7
8
9
10
11
>>>r=requests.get('https://api.github.com/user'),auth=('user','pass)')
>>>r=status_code
200
>>>r.header'content-type']
'application/json,charset=utf8'
>>>r.encoding
'utf-8'
>>>r.text
u'{"type":"user"...'
>>>r.json()
{u'private)gists':419,u"total_private_repos':77,...}

要注意在抓取一个网站的信息之前一定要看一眼这个网站是否有爬虫协议
比如豆瓣的爬虫协议是这样的:

有的网站会提供这样的一个文件robots. 如果有的话就表示它有自己的爬虫协议
如果要抓取多个页面的话要注意它的延迟,比如这里是五秒钟:

下面以抓取豆瓣小王子的评价为例

在Anaconda中已经预装了Requests库,所以我们可以直接把它import进来(如果没有安装的话可以通过pip install安装)

1
2
3
4
5
6
7
8
>>>import requests
>>>r=requests.get('https://book.douban.com/subject/1084336/comments/')
#然后通过它的get方法把我们要请求页面的url放进去
>>>r.status_code
200
#看一下它的状态码,200 一切正常
r.text
#下面就是抓取到的页面内容

但是有些网页是动态生成的,直接抓取这类网页它的内容可能并不包含我们要的数据
比如我们要抓取道指成分股的股票数据的基本信息
它的源码中我们可以看到我们想要的数据并不是通过直接抓取这个url,而是用js动态生成的
当然,一个网站的生成方式 可能并不一定是一样的 比如说有的数据有时候也是比较容易获得的
我们可以寻找一些非动态页面进行抓取,也可以利用我们后面介绍的API进行数据的获取,还有利用一些现成的数据集