赞
踩
首先得创建一个scrapy项目,若不会的请看其他创建scrapy项目的博客文章或者我的这篇scrapy安装介绍scrapy安装与创建项目
然后得明白scrapy框架是如何去部署爬虫的,看大图:
引擎(Scrapy Engine)从调度器(Scheduler)拿取一个url链接,将此链接给下载中间件(Downloader Middlewares),下载中间件在处理请求体,给下载器,下载器完成下载网页工作后,将结果给下载中间件,下载中间件再给引擎,引擎再将结果给爬虫中间件(Spider Middlerwares) 爬虫中间件再将结果给爬虫解析器(Spiders),爬虫解析器再将解析后的结果result给管道(Item Pipline)若解析出url链接,可以将链接通过引擎给调度器。这样就完成了一个工作流程。
这里根据搜索框的内容去爬取商品的图片、商品标题、价格、月销量、店铺名,如下图:
#自定义下载中间件 # 导包 from selenium import webdriver from scrapy.http import HtmlResponse,Request from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from .custom_package.ip_pool import ip_Pool import random class seleniumMiddleware: ''' 功能: 该中间件实现selenium对接,获取response 实现步骤: 1、创建selenium实例对象 2、 ''' def __init__(self): # 创建属性对象,方便后边儿设置属性 self.options = webdriver.ChromeOptions() # 设置无头浏览器 # self.options.add_argument('--headless') self.options.add_argument('--disable-gpu') # 请求链 def process_request(self, request, spider): try: pro={'proxy':'http://'+request.meta['proxy']['http'],} # 设置代理 self.options.add_argument('proxy-server=http://'+ request.meta['proxy']['http']) # 创建谷歌对象 self.driver = webdriver.Chrome(options=self.options) print("Chrome driver begin...") # 发起请求 self.driver.get(request.url) #滚动条下滑 self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 设置谷歌浏览器等待时间 ---在10秒内浏览器会去检测网页中是否有要求的元素对象存在 element = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="mx_5"]/ul/li[60]')) ) # 返回一个response对象(因为这里是用selenium去获取的网页源代码,所以要创建一个response对象返回给下一个中间件处理) return HtmlResponse(url=request.url,body=self.driver.page_source,status=200,request=request,encoding='utf8') except Exception: print("selenium请求发生异常") # 发生异常也要返回一个response对象,但是这个对象body属性内容为空 return HtmlResponse(url=request.url,status=200,request=request,encod
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。