第八天,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"]