python+scrapy简单爬取淘宝商品信息

python结合scrapy爬取淘宝商品信息

一、功能说明:
  • 已实现功能:
    • 通过scrapy接入selenium获取淘宝关键字搜索内容下的商品信息。
  • 待扩展功能:
    • 爬取商品中的全部其他商品信息。
二、代码解读:
1、创建项目

首先得创建一个scrapy项目,若不会的请看其他创建scrapy项目的博客文章或者我的这篇scrapy安装介绍scrapy安装与创建项目
然后得明白scrapy框架是如何去部署爬虫的,看大图:
scrapy架构图

2、scrapy工作流程文字解释

引擎(Scrapy Engine)从调度器(Scheduler)拿取一个url链接,将此链接给下载中间件(Downloader Middlewares),下载中间件在处理请求体,给下载器,下载器完成下载网页工作后,将结果给下载中间件,下载中间件再给引擎,引擎再将结果给爬虫中间件(Spider Middlerwares) 爬虫中间件再将结果给爬虫解析器(Spiders),爬虫解析器再将解析后的结果result给管道(Item Pipline)若解析出url链接,可以将链接通过引擎给调度器。这样就完成了一个工作流程。

3、明确目标

这里根据搜索框的内容去爬取商品的图片、商品标题、价格、月销量、店铺名,如下图:
在这里插入图片描述

4、正式部署scrapy项目
  • 编写自己的下载中间件
    • 为啥编写下载中间原因:因为我要使用代理和接入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):
        print("*
  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值