Python爬虫系列:(四)页面抓取

上一篇我们讲了模拟登陆微博的相关知识,这一篇来简单聊聊网页抓取的一些知识。

爬虫预备知识中我们谈到了http的几种常用请求方法,最常用的莫过于get/post两种方法,我们平时就是用这两种方法和页面进行交互,所以,如果爬虫想要获取到页面,也必须模拟这两种方法,好在目前存在很多优秀的http请求库,例如Python的requests、Java的httpclient等,都封装了各种http请求。我们用的主要就是requests库,以微博页面为例,我们来看看它的用法吧(可能耐性看了上一篇微博模拟登陆的同学已经知道怎么用requests了,不过我还是啰嗦一下...)

最简单的,我们抓取微博首页:

r = requests.get('http://weibo.com')

这里的r是服务器响应内容,其中包括了html源码、状态码、响应头、编码方式等。

r.status_code

200

r.encoding

'ISO-8859-1'

r.text

网页源码

我再来说说这几者的作用。

status_code可用于返回的东西是否是符合规定的,比如我们请求一个不存在的网页,就会返回404,某些需要登陆的网页可能就会返回403等,所以有时候可以直接根据返回的状态码确定下一步的动作,比如是否需要做解析和存储,如果返回403是否需要通知用户账户状态不对...

即使是状态码就是200,返回的内容也不见得是我们想要的。当我们抓取微博内容时,即使是我们请求了一个不存在的微博连接,它的状态码仍是200,只是页面内容变化了。而我们可以通过r.text来获取页面内容

有的时候我们拿到了页面信息,却发现看不懂其中的内容,所以解析页面就无从下手了,比如微博搜索页面,就是这样。这个时候r.encoding就起作用了,可以这样用:

r = requests.get(url)
# 如果是乱码则设置为某种编码
r.encoding='utf-8'
data = r.text
print(data)

也可以这样用:

r = requests.get(url)
data = r.text
encode_data = data.encode('utf-8', 'ignore').decode('utf-8', 'ignore')

我一般是用的第二种方式。

其实关于编码的知识应该是页面解析部分知识了,先讲了...


刚讲的是最简单的请求情况,一般为了让爬虫伪装得更像真正的浏览器,我们都需要带上请求头参数(headers),headers可以通过抓包软件进行获取和构造,也可以通过chrome按F12点击network查看请求头再模拟构造。它的数据结构在requests中是一个字典类型,目标服务器一般根据的是headers中的User-AgentRefererCookie等信息来判断是否是爬虫,但是如果你如果在设置了这些参数后还是请求不到想要的信息,那么最好通过手动访问,把手动访问的所有headers信息都设置进来。

除了请求头参数,还有请求参数,请求参数是用一个dict进行封装的,然后用params=yourdict这种形式进行使用。下面是一个例子:

requests.get(url, params={'key': 'test'}, headers=yourheaders)

常用的就是这么设置了,上面举的都是get的相关例子,对于用post提交表单也同样适用。如果需要特殊的一些用法,那么请查看requests文档

关于页面抓取的知识差不多就说完了,许多还是要自己实践才能懂得并掌握的。这个系列的博客我会一直更新,直到我把微博相关的爬虫和自动化的爬取方式等高级内容讲完了,就不会更新了。


奉上我的微博爬虫的github地址,觉得有用就给个star吧(渴求.jpg):WeiboSpider