1、问题描述
用requests打开拉勾网,一般情况下会得到访问太频繁的错误提示。但是实际上是不是呢?只要通过浏览器能打开的那个网页,那么爬虫一般都是可以打开的,所以这其实是一个反爬的问题,最关键就是设置好请求头headers
这里找动态页面的地址我就叙述了,主要是说如何设置请求头,关键是cookie的问题
2、思路描述
前提是找到最终包含你想要数据的动态页面地址
让我们来看看请求头headers里面有哪些信息?
一般情况下,要有User-Agent,然后有Referer,再复杂一点的要有Cookie,如果不嫌麻烦,把这些字段全部复制到请求头里面都行
其他字段都比较简单,可以复制过去,但是cookie由于字符串比较长,容易出问题,因此这里主要说明如何自动获取cookie
3、cookie自动获取
cookie有session自动获取,即我们先以seession的形式打开一个静态网页,然后得到cookie,再将得到的cookie放入请求头中,访问动态页面
4、代码解析
import requests
#地址准备
#静态页面地址
static_url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
#动态页面地址
aj_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
#设置请求头,复制页面中的请求头即可,设置后格式
headers ={
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
}
#传输data数据,用于post动态页面
data = {
'first': 'true',
'pn': 1,
'kd': 'python',
}
#建立session,我们用同一个session先后访问静态和动态页面,可以用同一个cookie
sess =requests.session()
#访问静态页面
sess.get(static_url,headers =headers)
#得到cookie
cookies = sess.cookies
#再请求动态页面
resp =sess.post(url =aj_url,headers=headers, data=data,cookies=cookies)
# resp= sess.post(url=aj_url, headers=headers, data=data, cookies=cookies, timeout=3)
print(resp.text)
贴一个爬取广东省政府采购网的代码
import requests
#地址准备
#静态页面地址
static_url = 'http://www.gdgpo.gov.cn'
#动态页面地址
aj_url = 'http://www.gdgpo.gov.cn/search.do'
#设置请求头,复制页面中的请求头即可,设置后格式
headers ={
'Referer': 'http://www.gdgpo.gov.cn/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
}
#传输data数据,用于post动态页面
data = {
'keyWord': '空间规划',
'pageIndex':2,
'pageSize':10,
"pointPageIndexId":1,
}
#建立session,我们用同一个session先后访问静态和动态页面,可以用同一个cookie
sess =requests.session()
#访问静态页面
sess.get(static_url,headers =headers)
#得到cookie
cookies = sess.cookies
#再请求动态页面
resp =sess.post(url =aj_url,headers=headers, data=data,cookies=cookies)
# resp= sess.post(url=aj_url, headers=headers, data=data, cookies=cookies, timeout=3)
with open('ss.html','w',encoding='utf-8') as ff:
ff.write(resp.text)
5、引申——json文件的处理
上述中得到的数据是一个json格式文件,json可以直接转成dict字典,然后可以非常方便地取出数据。但是往往得到的json字符串缩进不整齐,很难看出层次关系。
散乱的json数据排列
这时候,推荐一个网站在线json检校工具,复制进去json形式的字符串,可以帮助整理缩进格式。
可以说是一个很不错的工具。
网友评论