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

在爬学校安全教育题库的时候发现题库分页实际上执行了一段js代码,如下图所示在这里插入图片描述
在这里插入图片描述
点击下一页时是执行了函数doPostBack,查看页面源码如下
对于无法直接获取URL的数据爬虫_第1张图片
点击下一页后这段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)中必须得有东西,不能是空的,要不然会报错…

懒得排版,凑合看看

你可能感兴趣的:(爬虫)