Python爬取ajax加载的内容

打印 上一主题 下一主题

主题 528|帖子 528|积分 1584

在爬取某个实验室安全教育的练习的答案的时候,使用Python的requests库直接爬取该网页,结果与浏览器所看到内容不同。
  1. import requests
  2. url='xxxx'    #要爬取的网站,这里省略
  3. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}
  4. res = requests.get(url, headers=headers)
  5. res.encoding = 'utf-8'
  6. html = res.text
  7. with open('d:/html.txt','w',encoding='utf-8') as f:#写入文件
  8.     f.write(html)
复制代码
爬取的结果如下图所示:
有些时候我们使用浏览器查看页面正常显示的数据与使用requests抓取页面html得到的结果不一致,这是因为requests获取的是原始的HTML文档,而浏览器中的页面是经过JavaScript处理数据后的结果。这些处理过的数据可能是通过Ajax加载的,可能包含HTML文档中,可能经过特定算法计算后生成的。可以看到试卷和题目是动态加载的,直接进行get获取不到。

 
 对该网页进行抓包,在一个xhr里发现了所需要爬取的数据。

 
 可以看到所需资源的url,请求方式是post。

 
 
 
 
 重新改写代码
  1. mport requests
  2. from bs4 import BeautifulSoup
  3. import json
  4. import jsonpath
  5. html_url = "xxxx"    #这里改用新网址
  6. payload = {'ID':'9','Type':'xx'}
  7. res = requests.post(html_url,data=payload)
  8. res.encoding = 'utf-8'
  9. html=res.text
  10. with open("d:/test.jtxt",'w',encoding='utf-8') as f:
  11.         f.write(html)<br>
复制代码
结果如下图:

 
 
可以看到是XML格式, 使用bs4库的BeautifulSoup模块进行解析;string标签下又是json格式的数据,使用jsonpath提取json格式中的数据。
  1. from bs4 import BeautifulSoup
  2. import json
  3. import jsonpath
  4. #解析XML
  5. soup = BeautifulSoup(html,"xml")
  6. s = soup.string #获取string标签下的内容
  7. with open("d:/selfstudy.json",'w',encoding='utf-8') as f:
  8.         f.write(soup.string)#将数据写入json文件
  9. #加载json文件,返回值为python的字典对象
  10. obj = json.load(open('d:/selfstudy.json','r',encoding='utf-8'))
  11. #获取题目和答案
  12. caption = jsonpath.jsonpath(obj,'$..Caption')#jsonpath语法 $..+根节点名称
  13. answer = jsonpath.jsonpath(obj,'$..AnSwer')
  14. with open('d:/safe.txt','w',encoding='utf-8') as f:#写入文件
  15.         for i in range(len(caption)):#标题和答案都是list类型且长度相等
  16.                 f.write(caption[i]+'\t答案:'+answer[i]+'\n')
复制代码
附上结果图:

 
代码汇总:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import json
  4. import jsonpath
  5. html_url = "xxxx"
  6. payload = {'ID':'9','Type':'xx'}
  7. res = requests.post(html_url,data=payload)
  8. res.encoding = 'utf-8'
  9. html=res.text
  10. #解析XML
  11. soup = BeautifulSoup(html,"xml")
  12. with open("d:/selfstudy.json",'w',encoding='utf-8') as f:
  13.         f.write(soup.string)#获取soup标签下的数据
  14.         
  15. #加载json文件
  16. obj = json.load(open('d:/selfstudy.json','r',encoding='utf-8'))#转换为dict对象
  17. <br>#使用jsonpath读取根节点的数据
  18. caption = jsonpath.jsonpath(obj,'$..Caption')#jsonpath语法 $..+根节点名称
  19. answer = jsonpath.jsonpath(obj,'$..AnSwer')
  20. with open('d:/safe.txt','w',encoding='utf-8') as f:#写入文件
  21.         for i in range(len(caption)):
  22.                 f.write(caption[i]+'\t答案:'+answer[i]+'\n')
复制代码
 
 
参考资料:
http://t.zoukankan.com/yunlongaimeng-p-9535386.html
https://blog.csdn.net/qq_34160248/article/details/121605538
      
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表