头绕小星星 2020-03-18 18:40 采纳率: 0%
浏览 911
已结题

爬虫爬取aqistudy网站问题

一、概述

先贴上网站首页地址:https://www.aqistudy.cn/historydata/

需要抓取对应city下的逐月数据,最终需要爬取的网站示例如下:https://www.aqistudy.cn/historydata/monthdata.php?city=%E5%8C%97%E4%BA%AC

我所使用到的代码可以参考这一篇:https://www.jianshu.com/p/87ab84828a5d

爬取这个网站的初衷只是想练习一下爬虫,并且网上有大量关于爬取该网站的示例,我选用的是python+scrapy+selenium的方法。但是 参考目前网上的爬取方法并不可行,主要的问题如下:

二、主要问题

2.1.开发者模式下调试最终页面会被网站识别

图片说明

解决方法我已经找到,参考 https://www.liuyixiang.com/post/109399.html

主要问题在于页面上的endebug函数,对它进行对应处理后就可以进行调试。

2.2.使用chromedriver模拟登陆同样会被识别

在有头模式下对最终网站模拟登陆仍会弹出上述页面(无头也尝试过),说明网站依然监测到了爬虫。我对之前的endebug函数进行了JS反混淆,但是仍看不出反混淆后的代码是如何识别到chromedriver的,或者它和2.1有什么共性因素而被识别出来(不确定是否是这样做,初学者多多包涵)。

如果对网站的JS加载进行停用,如下对middlewares设置,那么不会弹出非法调试的页面,但是需要爬取的AQI等数据无法完全加载出来。

class AreaSpiderMiddleware(object):
    def process_request(self, request, spider):
        prefs = {
            'profile.default_content_setting_values': {
                'images': 2,
                'javascript': 2  # 2即为禁用的意思
            }
        }
        chrome_options = Options()
        chrome_options.add_experimental_option('prefs', prefs)  # 禁止加载图片,JS
        chrome_options.add_argument("--disable-extensions");
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.driver = webdriver.Chrome(chrome_options=chrome_options)
        if request.url != 'https://www.aqistudy.cn/historydata/':
            self.driver.get(request.url)
            js = "window.endebug = () => true;return endebug()"
            # 执行js
            self.driver.execute_script(js)
            time.sleep(1)
            html = self.driver.page_source
            self.driver.quit()
            return scrapy.http.HtmlResponse(url=request.url, body=html.encode('utf-8'), encoding='utf-8', request=request)

所以我目前能想到的是可否参照2.1的方法对网页加载运行到endebug时进行暂停,然后再重写JS方法,但是具体方法不知道怎么写。

或者针这种情况是否有更好的策略,希望有大神指点下,感谢!!!

  • 写回答

3条回答 默认 最新

  • threenewbee 2020-03-18 22:20
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决