• 第八天,scrapy的几个小技巧


    一. 微博模拟登陆
    1. 百度搜微博开放平台可满足爬取量不大的情况
    2. 微博模拟登陆和下拉鼠标应对ajax加载
    from selenium import webdriver
    import time
     
    browser = webdriver.Chrome()
    browser.get('https://www.weibo.com')
    time.sleep(10)
    browser.find_element_by_css_selector("#loginname").send_keys("13880576568")
    browser.find_element_by_css_selector(".info_list.password input[node-type='password']").send_keys("shiyan823")
    browser.find_element_by_css_selector(".info_list.login_btn a[node-type='submitBtn']").click()
     
    # 鼠标下拉
    for i in range(3):
        browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
        time.sleep(3)
     
     
     
     
    二. chromedriver不加载图片
    from selenium import webdriver
     
    chrome_opt = webdriver.ChromeOptions()
    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_opt.add_experimental_option("prefs", prefs)
    browser = webdriver.Chrome(chrome_options=chrome_opt)
    browser.get("https://www.taobao.com")
     
     
     
    三. 把selenium集成到scrapy中
    以伯乐在线为例子
    1. jobbole.py->JobboleSpider类中添加如下代码,引入了信号量
    from scrapy.xlib.pydispatch import dispatcher
    from scrapy import signals
    from selenium import webdriver
     
    def __init__(self):
        self.browser = webdriver.Chrome()
        super().__init__()
        dispatcher.connect(self.spider_closed, signals.spider_closed)
     
    def spider_closed(self, spider):
        #当爬虫退出的时候关闭chrome
        print ("spider closed")
        self.browser.quit()
     
    2. middleware.py中添加
     
    from selenium import webdriver
    from scrapy.http import HtmlResponse
     
    class JSPageMiddleware(object):
        #通过chrome请求动态网页
        def process_request(self, request, spider):
            if spider.name == "jobbole":
                # browser = webdriver.Chrome()
                spider.browser.get(request.url)
                import time
                time.sleep(3)
                print ("访问:{0}".format(request.url))
     
                return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
     
     
    3. 修改settings.py中的DOWNLOADER_MIDDLEWARES
    'Article.middlewares.JSPageMiddleware': 1,
     
     
     
    四. 无界面chrome运行
    linux下运行
    pip install pyvirtualdisplay
    pip install xvfbwrapper
    apt-get install xvfb
     
    from pyvirtualdisplay import Display
    display = Display(visible=0, size=(800,600)
    display.start()
    browser = webdirver.Chrome()
    browser.get()
    scrapy下无界面方式: scrapy-splash
     
     
     
     
    五. scrapy的暂停和重启
     
    以拉钩网为例,测试暂停和重启
    1. 在项目目录先新建文件夹job_info,和scrapy.cfg同级
    2. 在cmd命令行中,进入项目所在目录,执行如下代码
    scrapy crawl  lagou -s JOBDIR=job_info/001
    3. 按一次ctrl +c ,还会自动执行一些后续命令,等它处理完
    4. 同样运行scrapy crawl lagou -s JOBDIR=job_info/001,完成重启。接着之前的继续运行
    5. 如果想重头爬scrapy crawl lagou -s JOBDIR=job_info/002
    6. 按两次ctrl + c是立刻中断
     
     
     
    六. scrapy url去重原理
    以伯乐在线为例,首先注释掉之前设置的对接selenium,包括DOWNLOAD_MIDDLEWARES和jobbole.py中的相关代码
     
    默认去重源码在dupefilters.py中
     
     
     
    七. scrapy telnet服务
    爬虫运行时,会启动一个telent服务,端口一般为6023
    在控制面板->程序->启动或关闭windows功能中开启telnet
    可在cmd中输入telnet localhost 6023即可连上telnet
    telnet相关操作命令
    1)输入est()可查看爬虫状态
    2) 获取settings中的值 settings["COOKIES_ENABLED"]
     
     
     
     
     
  • 相关阅读:
    git 账号密码
    sql server 备份
    计算经纬度的两点之间的距离
    redis 安装
    webapi 可空参数
    Asp.Net MVC4 使用Unity 实现依赖注入
    sublime主题推荐
    分解质数因子
    如何在sublime+chrome中调试php代码?
    php的mysql语句里变量加不加单引号问题
  • 原文地址:https://www.cnblogs.com/regit/p/9718924.html
Copyright © 2020-2023  润新知