一、概述
先贴上网站首页地址: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方法,但是具体方法不知道怎么写。
或者针这种情况是否有更好的策略,希望有大神指点下,感谢!!!