爬虫三步走包括爬取数据、解析数据和保存数据,Python强大之处就是每一步都提供了强大的库,我们只要使用对应的库,就能把网站中想要的数据爬取下来。第一步爬取数据,最常用的就是Requests库。Requests库主要的功能是模拟浏览器向网站发起HTTP请求,把整个网页的HTML代码爬取下来,下面介绍下Requests库的使用流程。
安装
pip install requests
导入
import requests
主要方法
requests.request() //构造一个请求
requests.get() //GET方式请求
requests.head() //获取HTML网页头信息
requests.post() //POST方式请求
requests.put() //PUT方式请求
requests.patch() //PATCH方式请求
requests.delete() //DELETE方式请求
一个HTTP请求通常包括URL和请求方法,URL指的是统一资源定位符,可以理解成一个网络上的资源;而常用的请求方法有get、post、put、delete、patch,分别代表对资源的获取、创建、创建和更新、删除、部分更新。head指只获取头信息。
一个HTTP方法有安全和幂等两个属性,其中安全指的是不修改资源的HTTP方法;幂等指的是无论调用多少次,结果仍然相同。
下面是一些常用的HTTP方法的安全性和幂等性:
HTTP Method | Idempotent | Safe |
---|---|---|
GET | yes | yes |
HEAD | yes | yes |
PUT | yes | no |
POST | no | no |
DELETE | yes | no |
PATCH | no | no |
更详细的可查看: RESTful手册
使用
import requests
url = 'https://www.douban.com/group/topic/130361854/'
r = requests.get(url)
返回
r.status_code #状态码
r.text #返回对象的文本内容
r.content #返回对象的二进制形式
r.encoding #编码方式
r.apparent_encoding #响应内容编码方式
更多状态码查看: HTTP状态码
封装通用方法
- 定义函数
- 设置超时
- 异常处理
import requests
url = 'https://www.douban.com/group/topic/130361854/'
#定义函数
def getHTML(url):
try:
r = requests.get(url, timeout=20) #设置超时
return r.text
except: #异常处理
return "产生异常"
if __name__ == '__main__':
print(getHTML(url)) #调用函数
参数和headers
一般网页的反爬机制是通过检查请求头信息实现的,当发现要爬取的网页headers跟一般的请求头不一致时,我们需要添加headers来达到模拟浏览器发起请求,才能成功获取数据。有时候也需要传参数,比如翻页参数等。
常见的请求头
- Accept:
- Accept-Encoding:
- Accept-Language:
- Connection:
- Cookie:
- Host:
- Referer:
- User-Agent:
#设置header和传参数
import requests
url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false"
data = {
"first": "false",
"pn": 1,
"kd": "python",
}
header = {
"Cookie": "JSESSIONID=ABAAABAAAIAACBI2D68CE59E04E9B916073CE597D576077; WEBTJ-ID=20180928001706-1661bd1cc3d192-07081ccd396238-1132685e-1440000-1661bd1cc43ad; _ga=GA1.2.1398948892.1538065026; user_trace_token=20180928001659-c2f7d144-c270-11e8-a746-525400f775ce; LGUID=20180928001659-c2f7d48f-c270-11e8-a746-525400f775ce; X_HTTP_TOKEN=49a65ea9a50465953839a839bd605f07; _putrc=F69826498ED2888D; login=true; unick=%E8%B0%A2%E5%B2%B3; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22166a479151b22c-02b9afb9c550b-3468780b-1440000-166a479151c217%22%2C%22%24device_id%22%3A%22166a479151b22c-02b9afb9c550b-3468780b-1440000-166a479151c217%22%2C%22props%22%3A%7B%22%24latest_utm_source%22%3A%22m_cf_cpt_baidu_pc%22%7D%7D; LG_LOGIN_USER_ID=098d626900ab0bf0bfb563ee060f7bb5c56b489a328b6a09; TG-TRACK-CODE=index_code; _gat=1; LGSID=20181216131822-01c80f36-00f2-11e9-8d2a-5254005c3644; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; _gid=GA1.2.1593998340.1544937506; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1544621337; index_location_city=%E5%B9%BF%E5%B7%9E; SEARCH_ID=0fe5797c95e2425f950da090a3f514aa; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1544937595; LGRID=20181216131951-36e9801b-00f2-11e9-9315-525400f775ce",
"Referer": "https://www.lagou.com/jobs/list_python?city=%E5%B9%BF%E5%B7%9E&cl=false&fromSearch=true&labelWords=&suginput=",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
}
result = requests.post(url, data=data, headers=header)
爬虫协议
搜索引擎的蜘蛛机器人(spider)对网站进行爬行并索引网页,并随后通过关键字搜索为网站带来流量,但是有些私密的或是不适宜公开的信息或数据不希望被爬取,这时候就需要robots.txt了,通过它对搜索引擎给予指示,限制搜索引擎对特定内容的访问。
- 什么是爬虫协议:告诉爬虫机器人哪些页面可以抓取,哪些页面不可以抓取
- 如何查看爬虫协议:在网站根域名后加上robots.txt,如淘宝的爬虫协议:https://www.taobao.com/robots.txt
- 了解更多爬虫协议: robots协议
robots.txt语法:
User-agent: 适用的搜索引擎
Disallow: / 禁止访问的目录
Allow: / 允许访问目录
Disallow: /*blocked 禁止爬取带blocked的文件和目录
Disallow: /*.php$ 禁止爬取php结尾的文件
robots.txt实例:
拦截所有的机器人:
User-agent: * 适用于所有机器人
Disallow: /
允许所有的机器人:
User-agent: *
Allow: /
针对百度搜索引擎的爬取协议:
User-agent: Baiduspider 适用于百度机器人
Allow: /article 允许百度机器人爬取article目录
Allow: /oshtml
Disallow: /product/ 禁止爬取product目录
Disallow: /*blocked 禁止爬取带blocked的文件和目录
Disallow: /*.php$ 禁止爬取php结尾的文件
需要注意的是:
- 如果指定了某个机器人的规则,对于所有机器人的规则对该机器人就不起作用。
- robots.txt 不是命令,也不是防火墙,只是一个“君子协议”, 无法阻止恶意闯入。
下一篇将会进行实战,爬取一些知名的网站。看看它们的反爬机制是怎样的,能不能爬取到我们想要的数据。
网友评论