在爬学校安全教育题库的时候发现题库分页实际上执行了一段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 time
idx = [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 = True
return 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 = 2
for 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)中必须得有东西,不能是空的,要不然会报错…