一、准备
- 先要准备一个浏览器,然后会解析头,当然,其他软件(如burpsuit也行)。
- 然后选择一个网站。
二、正式开始
- 选好了网站:
2. 我们尝试直接用普通的代码爬一下:
from bs4 import BeautifulSoup
import requests
import urllib
def main():
result = requests.get("https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&xl=%E6%9C%AC%E7%A7%91&hy=%E"
"7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD#filterBox"
)
print result.content
if __name__=="__main__":
main()
的出来的结果是
3. 很遗憾,爬不出来,这是因为这个网站设置了反爬虫机制,怎么办呢?
- 我们回想一下,为什么我们用浏览器可以访问,而用requests访问不了呢?
- 那是因为我们缺少相应的‘头’信息!
- 那我们就加上头!
#coding=utf-8
from bs4 import BeautifulSoup
import requests
import urllib
def main():
#创建一个头(请求头)
header={
"Host":"www.xxxxx.com",
"Referer":"https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&hy=%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%"
"81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
}
result = requests.get("https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&xl=%E6%9C%AC%E7%A7%91&hy=%E"
"7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD#filterBox"
,headers=header)
print result.content
if __name__=="__main__":
main()
这里需要注意一下:
- Referer:你从哪个网站跳过来的
- Host:主网站
- user-agent:这是必须加进去的,不管是使用urllib还是requests还是scrapy框架
然后我们再试一下:(直接上对比图)
看到了吧~压根没数据!这时候就根据开发经验,可以晓得:
- 这个很可能是通过异步数据加载来完成数据填充的,即Ajax
我们可以过滤Ajax包,就可以直接拿到它的数据了。
- 这里我们这样过滤:选择XHR
- 看到positionAjax吧啦吧啦的,选它
- 查看当前内容,发现是POST请求!
- 修改GET为POST,并且补充相应的表单数据(form_data)
- 修改POST请求的链接为相应的***Ajax包的地址***,修改后代码如下:
header={
"Host":"www.lagou.com",
"Referer":"https://www.xxxxx.com/jobs/list_?px=new&gx=%E5%AE%9E%E4%B9%A0&gj=&xl=%E6%9C%AC%E7%A7%91&hy=%E7%A7%BB"
"%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0",
"X-Anit-Forge-Code" : "0",
"X-Anit-Forge-Token": None,
"X-Requested-With":"XMLHttpRequest"
}
# POST还会发送一些数据体:“表单数据”
form_data = {
"first": "true",
# 第几页
"pn": "1",
# 查询的关键字
"kd": ""
}
result = requests.post("https://www.xxxxx.com/jobs/positionAjax.json?xl=%E6%9C%AC%E7%A7%91&hy=%E7%A7%BB%E5%8A%A8%E4%"
"BA%92%E8%81%94%E7%BD%91&px=new&gx=%E5%AE%9E%E4%B9%A0&needAddtionalResult=false&isSchoolJob=1"
,headers=header, data=form_data)
然后检查一下json里面的内容,发现结构是这样的:
即: [‘content’][‘positionResult’][‘result’]
- 因为是json包,所以可以用json模块进行分析(解析)
json_result = result.json()
positions = json_result['content']['positionResult']['result']
#使用json模块格式化内容,不采用ascii格式
line = json.dump(positions,ensure_ascii=False)
#这里普及一下文件输入输出格式:w写 r读 rw rb...
with open("spider.json",'w') as fp:
#采用utf-8编码
fp.write(line.encode('utf-8'))
好了,到了这一步,分析基本差不多了。可以由 ‘pn’ 页数来一页一页爬
但是!这个网站,又搞了一个反爬虫机制:不能连续爬,连续爬的后果是:
“您操作太频繁,请稍后再访问”
content没数据
怎么解决呢,emmm,最方便的就是
import time
time.sleep(3)
够简单吧。。。(当然,还是有可能爬不出来)
三、过滤数据
这个比较简单:用个字典,把需要报讯的额保存起来,这里就不展开讲了