python结合scrapy爬取淘宝商品信息
一、功能说明:
- 已实现功能:
- 通过scrapy接入selenium获取淘宝关键字搜索内容下的商品信息。
- 待扩展功能:
- 爬取商品中的全部其他商品信息。
二、代码解读:
1、创建项目
首先得创建一个scrapy项目,若不会的请看其他创建scrapy项目的博客文章或者我的这篇scrapy安装介绍scrapy安装与创建项目
然后得明白scrapy框架是如何去部署爬虫的,看大图:
2、scrapy工作流程文字解释
引擎(Scrapy Engine)从调度器(Scheduler)拿取一个url链接,将此链接给下载中间件(Downloader Middlewares),下载中间件在处理请求体,给下载器,下载器完成下载网页工作后,将结果给下载中间件,下载中间件再给引擎,引擎再将结果给爬虫中间件(Spider Middlerwares) 爬虫中间件再将结果给爬虫解析器(Spiders),爬虫解析器再将解析后的结果result给管道(Item Pipline)若解析出url链接,可以将链接通过引擎给调度器。这样就完成了一个工作流程。
3、明确目标
这里根据搜索框的内容去爬取商品的图片、商品标题、价格、月销量、店铺名,如下图:
4、正式部署scrapy项目
- 编写自己的下载中间件
- 为啥编写下载中间原因:因为我要使用代理和接入selenium
不清楚下载中间件的具体处理流程的请看下载中间件处理流程
- 为啥编写下载中间原因:因为我要使用代理和接入selenium
#自定义下载中间件
# 导包
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,encoding='utf8')
finally:
self.driver.quit()
print("Chrome driver end...")
def process_response(self,request, response, spider):