MENU

数据采集与数据分析(python)

爬虫技术学习笔记与遇到的问题

记录selenium + chrome的一些配置

chrome_options = webdriver.ChromeOptions()
        if visible == 0:
            chrome_options.add_argument('--headless')  # 无头浏览器
        # option.add_argument("--auto-open-devtools-for-tabs") #打开devtools
        # chrome_options.add_argument('--disable-extensions')  # 禁用拓展
        # chrome_options.add_argument('--profile-directory=Default')  # 自定义配置文件
        # chrome_options.add_argument('--incognito')  # 让浏览器直接以隐身模式启动
        # chrome_options.add_argument('--disable-plugins-discovery')
        # chrome_options.add_argument('--disable-logging')  # 禁用日志生成
        # chrome_options.add_argument('--disable-gpu')  # 关闭GPU加速
        # chrome_options.add_argument('--no-sandbox')  # 取消沙盒模式
        # chrome_options.add_argument('--single-process')  # 单进程运行
        chrome_options.add_argument('--disable-dev-shm-usage')  # docker部署时分配空间
        chrome_options.add_argument('user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"')
        chrome_options.add_argument('blink-settings=imagesEnabled=False')  # 无图片加载

        chrome_options.add_experimental_option('useAutomationExtension', False)  # 解决软件正在收到自动化检测
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        chrome_options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉了webdriver痕迹
        if proxies:
            chrome_options.add_argument(f'--proxy-server=socks5://47.241.106.251:1080')
            # proxyauth_plugin_path = create_proxyauth_extension(
            #     proxy_host=proxies.split("@")[1].split(':')[0],
            #     proxy_port=proxies.split(':')[-1],
            #     proxy_username=proxies.split("//")[1].split(':')[0],
            #     proxy_password=proxies.split(":")[2].split('@')[0]
            # )
            # chrome_options.add_extension(proxyauth_plugin_path)

        filepath = get_root_path() + self._get_driver_path()
        self.driver = webdriver.Chrome(executable_path=filepath, chrome_options=chrome_options)
        self.driver.set_page_load_timeout(30)  # 浏览器页面加载超时时间
        self.driver.set_script_timeout(10)
        self.driver.implicitly_wait(10)

        injected_javascript = '''
            // overwrite the `languages` property to use a custom getter
            Object.defineProperty(navigator, "languages", {
              get: function() {
                return ["zh-CN","zh","zh-TW","en-US","en"];
              }
            });
            // Overwrite the `plugins` property to use a custom getter.
            Object.defineProperty(navigator, 'plugins', {
              get: () => [1, 2, 3, 4, 5],
            });
            // Pass the Webdriver test
            Object.defineProperty(navigator, 'webdriver', {
              get: () => false,
            });
            // Pass the Chrome Test.
            // We can mock this in as much depth as we need for the test.
            window.navigator.chrome = {
              runtime: {},
              // etc.
            };
            // Pass the Permissions Test.
            const originalQuery = window.navigator.permissions.query;
            window.navigator.permissions.query = (parameters) => (
              parameters.name === 'notifications' ?
                Promise.resolve({ state: Notification.permission }) :
                originalQuery(parameters)
            );

            '''
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": injected_javascript
        })
        self.driver.maximize_window()

基于arcpy实现导出区域内网格中心坐标功能

在进行数据采集的时候经常会用到基于“周边检索”结果的采集:就是利用平台(网站或APP)提供的"附近"检索功能,搜索"某个位置"周边“X千米”范围内的某类信息(例如POI),然后采集搜索出来的结果。这里的“某个位置”就是搜索圆形区域的圆心(搜索中心点),“X千米”指的是搜索半径。

这个搜索中心点的选取至关重要。因为如果选的少了会因为区域覆盖不全导致数据遗漏,选的太多(密)了,会增加搜索次数,影响采集效率。所以如何合理的选择搜索中心点很重要。例如,我们在采集"北京市房山区"内POI信息的时候就曾遇到过这样的问题。刚开始我们使用了"行政区、商圈、加油站"这三类信息点的位置作为搜索中心点,采集下来发现有不少遗漏。仔细检查后发现,原因是由于房山区相对比较偏远,这三类信息点比较少,搜索中心点比较少导致有很多地区覆盖不到,从而造成数据缺失。

一种合理的搜索中心点选取方法:将待采集区域划分成面积想等的若干网格,每个网格的面积由搜索半径确定,然后取网格中心点的坐标作为搜索中心点,这样区域内每个地方都能被覆盖到。

Read More

案例:使用Pdfplumber+Camelot解提取年报中的表格数据

很多朋友会问,pdfplumber也能解析表格,为什么还要使用Camelot呢?这因为年报中的表格很多都是一个单元格中有多个换行,像这样:
多行.jpg
pp的解析结果是每个换行都是表格中的一样,这很难提取出准确的数据。
相对于多换行,这样的pdfplumber就能正常解析:
QQ截图20210427172430.png

面对这一问题,使用Camelot的stream模式就能好解决,但是有个遗憾,就是它无法提取全文的字符串,只能提取表格,和所有与表格相关的元素。所以需要结合pdfplumber,通过pp来解决查找关键词。





Read More