当前位置:首页 > 编程笔记 > 正文
已解决

对于无法直接获取URL的数据爬虫

来自网友在路上 151851提问 提问时间:2023-10-10 18:17:52阅读次数: 51

最佳答案 问答题库518位专家为你答疑解惑

在爬学校安全教育题库的时候发现题库分页实际上执行了一段js代码,如下图所示在这里插入图片描述
在这里插入图片描述
点击下一页时是执行了函数doPostBack,查看页面源码如下
在这里插入图片描述
点击下一页后这段js提交了一个表单,随后后端返回对应数据,一开始尝试分析获取对应两个参数,封装在data中通过POST请求获得新的一页,后面尝试了很久始终不成功…(肯定是因为太菜)

没办法只能使用神器selenium,缺点是要调用浏览器,肯定是比较慢的,但是python直接给你模拟浏览器的各种操作,而且不用抓包分析,比较方便。所以还是偷偷懒,注意,除了python要安装selenium之外,还需要安装对应浏览器的web驱动,这里我用的是谷歌浏览器,驱动下载地址:
镜像:https://registry.npmmirror.com/binary.html?path=chromedriver/
如果你谷歌版本新,镜像上可能没有对应版本。
官网:https://sites.google.com/chromium.org/driver/downloads(117以上在这里找:这里~)

下载好后就是正常的爬虫步骤,直接看代码吧:

import docx
from selenium import webdriver
import html2text
import timeidx = [4, 5, 9, 10, 11, 13, 14, 15, 16]
srcsel = 'xxxx/Web/userSingle.aspx?ID='  # 选择题
srcjg = 'xxxx/Web/userIs.aspx?ID='  # 判断题def remove_tags(text):h = html2text.HTML2Text()h.ignore_links = Truereturn h.handle(text)def process(url):driver = webdriver.Chrome()driver.get(url)res = driver.find_element("id", 'GridViewx').get_attribute('innerHTML')res = remove_tags(res)doc.add_paragraph().add_run(res)pages = int(driver.find_element("id", 'GridViewx_ctl13_lblPageCount').text)# pages = 2for i in range(pages - 1):time.sleep(1.5)driver.find_element("id", 'GridViewx_ctl13_btnNext').click()res = driver.find_element("id", 'GridViewx').get_attribute('innerHTML')res = remove_tags(res)doc.add_paragraph().add_run(res)driver.quit()doc = docx.Document('res.docx')
for pid in idx:process(srcsel + str(pid))time.sleep(3)process(srcjg + str(pid))
doc.save('res.docx')

为什么多此一举用html2text呢?因为发现这样写又能比较好看(和丑的比起来)还不用自己一条数据一条数据取出来排版。然后代码里我直接写进word文档里了,这里有个小坑,你的word文档(docx)中必须得有东西,不能是空的,要不然会报错…

懒得排版,凑合看看
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"对于无法直接获取URL的数据爬虫":http://eshow365.cn/6-18497-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!