• selenium模拟浏览器对搜狗微信文章进行爬取


    在上一篇博客中使用redis所维护的代理池抓取微信文章,开始运行良好,之后运行时总是会报501错误,我用浏览器打开网页又能正常打开,调试了好多次都还是会出错,既然这种方法出错,那就用selenium模拟浏览器获取搜狗微信文章的详情页面信息,把这个详情页面信息获取后,仍然用pyquery库进行解析,之后就可以正常的获得微信文章的url,然后就可以通过这个url,获得微信文章的信息

    代码如下:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from weixin.weixin.weixin_article import WeixinArticle
    from requests.exceptions import ConnectionError
    from pyquery import PyQuery as pq
    
    
    class SeleniumWeixinArticle(WeixinArticle):
        """使用selenium模拟浏览器,获取搜狗微信搜索的详细信息,继承WeixinArticle这个类"""
        proxy = None
    
        def __init__(self):
            """初始化浏览器,及部分浏览器信息"""
            self.browser = webdriver.Chrome(executable_path="C:/codeapp/seleniumDriver/chrome/chromedriver.exe")
            self.wait = WebDriverWait(self.browser, 10)
            super(SeleniumWeixinArticle, self).__init__()
    
        def get_html(self, url, count=1):
            """重写WeixinArticle 中的get_html 用selenium模拟浏览器去获取搜狗微信搜索的信息"""
            if not url:
                return None
            # 最后递归max_count这么多次,防止无限递归
            if count >= self.max_count:
                print("try many count ")
                return None
            print('crowling url ', url)
            print('crowling count ', count)
            global proxy
            if self.proxy:
                proxy_ip = '--proxy-server=http://' + self.proxy
                chrome_options = webdriver.ChromeOptions()
                # 切换IP
                chrome_options.add_argument(proxy_ip)
                browser = self.browser(chrome_options=chrome_options)
            else:
                browser = self.browser
            try:
                browser.get(url)  # 返回值是None,要取数直接用browser.page_source
                next_page = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#sogou_next")))
                if browser.current_url == url:
                    page_source = browser.page_source
                    return page_source
                else:
                    print("must change ip proxy ")
                    proxy = self.get_proxy(self.proxy_pool_url)
                    if proxy:
                        return self.get_html(url)
                    else:
                        print("get proxy is faired ")
                        return None
            except ConnectionError:
                count += 1
                proxy = self.get_proxy(self.proxy_pool_url)
                return self.get_html(url, count)
    
    
    
    if __name__ == "__main__":
        weixin_article = SeleniumWeixinArticle()
        weixin_article.run()

    程序较为简单,主要是重写WeixinArticle中的get_html方法,其他的逻辑不变,这也是面向对象编程的好处,

    程序结构逻辑如下:

  • 相关阅读:
    关于c语言变量的内存分布测试程序
    常用ARM指令集及汇编_破解
    CPU读取内存0x30000000地址4个字节数据
    打印十六进制字符串查看内存地址
    JZ2440串口打印字符作为调试
    搭建Linux3.4.2内核编辑环境
    网卡驱动程序
    同步互斥阻塞
    poll机制分析[转]
    安装、配置、启动FTP、SSH或NFS服务
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8386883.html
Copyright © 2020-2023  润新知