在使用爬虫爬取某查查的数据的时候,会被识别到,进行反爬限制,最后使用selenium模拟浏览器进行爬取。
这里解决办法主要使用selenium打开浏览器,模拟人操作进行爬取,代码:
ua = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' #这里是用来隐藏弹出框的,如果没有这个,某查查会弹出提示框,会影响下一步操作 option = webdriver.ChromeOptions() prefs = { 'profile.default_content_setting_values': { 'notifications': 2 } } option.add_experimental_option('prefs', prefs) option.add_argument('--disable-gpu') # 使用浏览器开发者模式,配置实验性功能参数 option.add_experimental_option('useAutomationExtension', False) option.add_experimental_option('excludeSwitches', ['enable-automation']) #这里使用无头浏览器,如果要观察整个操作流程,可以将此代码注释掉 option.add_argument('--headless') option.add_argument('--no-sandbox') option.add_argument('--disable-dev-shm-usage') option.add_argument('user-agent=' + ua) driver = webdriver.Chrome(executable_path="C:\Program Files\Google\Chrome\Application\chromedriver", chrome_options=option) # 修改谷歌开发者工具中的新属性window.navigator.webdriver # 在加载网页js之前,将window.navigator.webdriver属性隐藏 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ }) driver.get('https://www.qcc.com/') #休眠3秒 time.sleep(3) #找到输入框的id,这里通过id定位 webelement = driver.find_element_by_id("searchkey") driver.implicitly_wait(2) # 输入文本,注意,如果搜索中文的,需要在前面加u,代表Unicode编码 webelement.send_keys(u'企查查') time.sleep(2) #输入完成后,找到查找按钮,然后点击查找按钮 webelement = driver.find_element_by_xpath('//*[@id="indexSearchForm"]/div[1]/span/input') webelement.click() time.sleep(2) print driver.page_source
整个流程就如代码所示,我这里查询的时候不需要登录就能查到需要的数据,如果是需要登录的,也是类似的原理,无法就是多走一步,先登录,然后再进行查询。这里遇到的最主要的三个问题以及解决办法如下:
1、打开网页后,有弹框影响下一步操作
解决办法:如代码中所示,影藏弹框
2、根本无法打开查询页面
解决办法:一般是window.navigator.webdriver属性问题,我这里就是这个问题,可以先手动打开页面,查询window.navigator.webdriver属性是什么,F12打开Console,输入window.navigator.webdriver即可,这里是undefined,但是如果我们用浏览器打开,window.navigator.webdriver属性会显示是true,因此代码中将此属性隐藏。
3、一切完毕后,发现根本没法在输入框输入查询
解决办法:无意间发现的,基本都是搜索中文公司,无意间发现搜索英文名的公司就能打开,因此判断是需要使用Unicode编码进行搜索,因此在代码中字符串前面加个u,也可以使用三方转码工具进行转码操作。