Python使用selenium模拟浏览器爬取某查查数据

        在使用爬虫爬取某查查的数据的时候,会被识别到,进行反爬限制,最后使用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,也可以使用三方转码工具进行转码操作。

上一篇:微信小程序 navigator 导航


下一篇:JavaScript HTML DOM navigator对象