0%

python-简单爬虫

python 简单爬虫

这不是一篇完整的爬虫教程,这是一篇使用python完成简单爬虫的使用过程记录。
使用 python3 以及第三方库 requests 和 lxml 以及 xpath 技术来爬取一些网页数据
这里只是用了 GET 请求,没有使用 POST 请求

第三方库和技术介绍

requests: 这里使用 requests 来请求一个网页,并将响应结果封装在一个对象中返回

lxml: 使用 lxml 中的 etree 库对响应的 HTML 页面进行解析

xpath: 一种解析 xml 文档的技术,也可以解析 HTML 页面。在w3c可以找到文档

过程介绍

  1. 使用 requests.get 函数请求对应的URL
  2. 如果请求正常并有返回,将返回结果通过etree.HTML处理
  3. 使用xpath技术对etree.HTML处理过的对象进行解析,获取对应的数据
  4. 数据存储

请求页面

请求头

使用requests.get(url)方式可以请求对应的url内容,并将响应结果封装在一个对象中返回,但是直接使用这种方式的请求头中包含这个"User-Agent":"python-requests/2.19.1"
有些服务器会通过这个请求头得知这是一个python爬虫请求从而拒绝响应。为了正常访问,需要传入一个请求头来覆盖这个属性,从而骗过请求服务器。

firefox浏览器中通过请求http://httpbin.org/get可以获得本机的请求头,下面是我请求的该链接的部分内容

本机请求httpbin.org

将请求中的User-Agent对应的属性作为键值对形式传入requests.get()headers参数,如下

1
2
header = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"}
response = requests.get(url, headers=header)

请求参数

如果你想要传入查询参数,只需要以键值对的形式传入requests.get中的params,下面的查询键为’user’,对应的值为’tom’

1
2
3
4
5
6
7
8
9
data = {"user":"tom"}
response = requests.get(url, params=data)
```python

如果你有多个查询值也可以添加多个键值对

```python
data = {"user":"tom","pwd":"jerry"}
response = requests.get(url, params=data)

请求超时设置

requests.get函数的timeout参数传入一个数字可以设置请求的最长时间

1
response = requests.get(url, timeout=0.1)

响应处理

使用response = requests.get()之后就获取了响应结果,这时可以对响应做一些处理

响应码

response.status_code返回请求的响应码,正常情况下返回200

字符设置

响应返回的结果不一定可以正常显示,对response.encoding属性进行赋值可以修改返回的字符集,一般设置为utf-8

1
response.encoding = 'utf-8'

返回结果

response.text将数据以文本形式返回,文本形式的字符集和字符设置有关,如果没有设置则返回响应数据设置的字符集

response.content将数据以字节形式返回,使用这种方式返回就不用担心返回的数据出现乱码问题

一个完整的请求实例

请求一个url并将响应结果以文本的形式返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user_agent = "User-Agent"
my_user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
header = {user_agent: my_user_agent}

def getPage(url, data=None) :
'''根据url请求一个html页面并返回'''
try :
r = requests.get(url, headers=header, params=data)
r.encoding = 'utf-8'
if r.status_code == 200:
return r.text
else :
raise Exception("返回页面信息失败")
except :
raise Exception("请求链接失败")

xpath处理

使用lxml中的etree库中的HTML函数可以将一个HTML页面转换为一个对象,对该对象使用xpath语法即可获取对应的数据。有关更多的xpath技术点击这里

1
2
3
from lxml import etree
html = etree.HTML(html)
html.xpath(xpath)

对于使用xpath语法来获取数据,在firefox浏览器中使用这个插件,可以在线使用xpath语法来匹配

注意:使用xpath语法返回的数据都是以列表形式返回

一个完整的可以爬取腾讯社招技术类的所有招聘信息的爬虫程序