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
      不清楚下载中间件的具体处理流程的请看下载中间件处理流程
#自定义下载中间件# 导包
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 randomclass 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("*"*50)print("执行了其他中间件")return responseclass  HttpProxyMiddleware:def __init__(self):IP_POOL=ip_Pool()self.proxies = self.ip(IP_POOL.ip_pool)def ip(self,IP_POOL):'''从IP_POOL(ip池)随机选出一个ip将其返回给主程序使用,:param IP_POOL: IP池:return: proxies ------随机的一个代理ip'''proxies = {"http": random.choice(IP_POOL),}return proxiesdef process_request(self, request, spider):try:request.meta['proxy']=self.proxiesexcept Exception:print("代理获取失败...")finally:print("代理中间件已执行...")pass
  • 编写自己的爬虫中间件,用来在爬虫解析前的一些预处理操作
    (这里只是为了不让爬虫解析文件看起来太臃肿,所以这里写个自己的爬虫中间件分担一下)不是很清楚爬虫中间件处理流程的请看爬虫中间件处理流程
#自定义爬虫中间件# 导包
from bs4 import BeautifulSoupclass Pretreatment_spider_Middleware:def process_spider_input(self, response,spider):'''#预处理response对象,剔除响应中无用(多余)的文本:return: None'''# 对返回体body属性解析创建soup对象self.soup=BeautifulSoup(response.body,"lxml")#传入li_tag_list对象response.meta['text']=self.soup.find_all('li')print("meta-proxy123:",response.meta['proxy'])
  • 注意:在编写完中间件后,要开启它,并且要关闭掉scrapy内置的一些中间件,以免跟自己的中间件冲突,看代码:
SPIDER_MIDDLEWARES = {# 'taobao_img2_master.middlewares.TaobaoImg2MasterSpiderMiddleware': 543,'taobao_img2_master.middlewares.Pretreatment_spider_Middleware': 543,}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {# 'taobao_img2_master.middlewares.TaobaoImg2MasterDownloaderMiddleware': 543,'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': None,'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': None,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,'taobao_img2_master.middlewares.seleniumMiddleware': 999,'taobao_img2_master.middlewares.HttpProxyMiddleware': 998,
}
  • 编写爬虫解析文件
import scrapy
from bs4 import BeautifulSoup
from ..items import TaobaoImg2MasterItem
import requests
class TaobaoImgSpider(scrapy.Spider):name = 'taobao_img'allowed_domains = ['ai.taobao.com']start_urls = ['https://ai.taobao.com/search/index.htm?spm=a231o.13503973.search.1&key=%E8%A1%A3%E6%9C%8D%E5%A5%B3&pid=mm_31205575_2223100233_111181550270&union_lens=recoveryid%3A201_11.21.57.63_3994313_1621134335459%3Bprepvid%3A201_11.21.57.63_3994313_1621134335459']def _init(self):'''功能:初始化一些属性,类似于__init__方法:return: None'''self.limit = 0self.issu=Falseself.url='''https://ai.taobao.com/search/index.htm?spm=a231o.13503973.search.1&key=%E8%A1%A3%E6%9C%8D%E5%A5%B3&pid=mm_31205575_2223100233_111181550270&union_lens=recoveryid%3A201_11.21.57.63_3994313_1621134335459%3Bprepvid%3A201_11.21.57.63_3994313_1621134335459'''def parse(self, response):'''功能:提取数据:param response::return:'''# 如果有这个属性则返回False,没有则返回True,那么一开始初始化并没有这个属性,初始化后有了,下一次调用的时候就会引用上次的属性值if not hasattr(self,'issu'):self._init()# 从预处理中间件得到的li_tag_list对象li_tag_list=response.meta['text']# 遍历li_tag_list对象得到单个li_tag对象,并处理得到需要的数据,再将其数据通过item返回给管道,从而存储于数据库中。try:count=0for li_tag in li_tag_list:# 创建item对象,用于保存数据item = TaobaoImg2MasterItem()# 找到商品图片对象img_tag=li_tag.select('a > .pc-items-item-img')# print("img_tag对象:",li_tag.select('a > .pc-items-item-img'))# 检测是否获取对像,若为空则跳过这次循环,直到获取到对象。if len(img_tag)==0:continuecount+=1# 提取对象中的数据try:# 获取月销量Monthly_sales = li_tag.select('.pc-items-item-a > .item-footer > .sell-info')[0].get_text()# 获取店名Shop_name = li_tag.select('.seller-name')[0].get_text()# 获取价格price = li_tag.select('.coupon-price-afterCoupon')[0].get_text()# 获取标题title = li_tag.select('.pc-items-item-title')[0].get_text()except Exception:print("提取第%d个对象中的(月销量、店名、价格、标题)数据失败" % count)# 获取图片img_tag = li_tag.select('.pc-items-item-img')[0]try:img_src='https:'+img_tag.attrs['src']except Exception:img_src = 'https:'+img_tag.attrs['data-src']finally:#下载图片# print("img_src:", img_src)img_src=requests.get(url=img_src,proxies=response.meta['proxy']).content# 将提取到的数据放入item对象中item['Monthly_sales'] = Monthly_salesitem['Shop_name'] = Shop_nameitem['price'] = priceitem['title'] = titleitem['img_src'] = img_src# 函数执行到这里先返回item对象给管道传到数据库存储,接下来再调用自身函数执行下一个链接。yield itemexcept Exception:print("遍历拿取单个商品信息出错,应检查li列表是否存在数据")finally:print("解析结束")#判断是否存在下一页try:self.limit+=1# 拼接下一页网页的urlself.next_url=self.url + '&pnum=' + str(self.limit)# 如果存在下一页则获取下一页商品信息if requests.get(self.next_url).status_code ==200:yield scrapy.Request(url=self.url + '&pnum=' + str(self.limit), callback=self.parse)except Exception:print("不存在下一页商品...")passfinally:print("本次商品信息获取结束...")pass
  • 编写item类,为爬虫解析时使用
import scrapyclass TaobaoImg2MasterItem(scrapy.Item):# 定义item的字段,便于后续接受数据Monthly_sales=scrapy.Field()Shop_name=scrapy.Field()price=scrapy.Field()title=scrapy.Field()img_src=scrapy.Field()
  • 编写pipline管道文件,将爬虫解析后的结果存储于数据库中
# 导包
import pymysql
import timeclass TaobaoImg2MasterPipeline:def open_spider(self,spider):'''这个函数在管道开启后只执行一次,也就是在爬虫被打开的时候才执行,那么我们可以在这里定义一些爬虫初始化的工作:param spider::return:'''try:print("连接数据库...")# 连接数据库--这里简写了self.coon = pymysql.connect(user='root', password='clly0528', db='gc')# 创建游标对象self.cur = self.coon.cursor()# 定义表结构语句sql = '''create table taobao_img(id int not NULL auto_increment,title varchar(200) not NULL,price varchar(30) not NULL,Monthly_sales varchar(40) not NULL,img_file_path varchar(200) not NULL,Shop_name varchar(200)  not NULL,is_delet tinyint(1) not NULL DEFAULT TRUE,primary key (id));'''# 判断是否有原表存在   若存在则删除self.cur.execute('show tables like "taobao_img"')if len(self.cur.fetchall()) == 0:# 没有表存在,创建表# 创建表try:self.cur.execute(sql)except Exception:print("sql语句出错")self.coon.commit()else:# 有原表存在,删除原表,self.cur.execute("drop table taobao_img")self.coon.commit()# 创建新表self.cur.execute(sql)self.coon.commit()print("数据库连接成功...")except Exception:print("连接数据库出错!")def close_spider(self,spider):'''爬虫关闭时运行此函数,一个爬虫开启一次那么关闭也只运行一次:param spider::return:'''print("关闭数据库")self.coon.close()def process_item(self, item, spider):'''在爬虫工作中接受爬虫返回来的item:param item::param spider::return:'''try:# 上述的img_src无法存储到数据库中(原因:总是因为二进制字节报错,还因为存储地址比二进制数据更利于数据库查询),所以这里选用存储图片地址的方式img_file_path = r'C:\\Users\\gc\\Desktop\\开发资料及项目文件\\项目文件\\自己项目文件夹\\淘宝女性衣服图片爬虫\\taobao_img2_master\\taobao_img2_master\\img_path'+'\\'+time.strftime(r'%Y_%m_%d_%H_%M_%S') + '.jpg'with open(img_file_path, "wb") as f:f.write(item['img_src'])# 定义sql语句insert_sql_01 = "insert into taobao_img(title,price,Monthly_sales,img_file_path,Shop_name) value("left = '"'right = '",'noll = '"'sql1 = insert_sql_01 + left + str(item['title']) + right + left + str(item['price']) + right + left + str(item['Monthly_sales']) + right + left + str(img_file_path) + right + left + str(item['Shop_name']) + noll + ")"# 执行sql语句self.cur.execute(sql1)self.coon.commit()except Exception:print("写入数据库出错")return item
  • 注意将管道开启
  • settings文件如下:
# Scrapy settings for taobao_img2_master project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlBOT_NAME = 'taobao_img2_master'SPIDER_MODULES = ['taobao_img2_master.spiders']
NEWSPIDER_MODULE = 'taobao_img2_master.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.4071 SLBChan/15'# Obey robots.txt rules
ROBOTSTXT_OBEY = True# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 12
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
SPIDER_MIDDLEWARES = {# 'taobao_img2_master.middlewares.TaobaoImg2MasterSpiderMiddleware': 543,'taobao_img2_master.middlewares.Pretreatment_spider_Middleware': 543,}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {# 'taobao_img2_master.middlewares.TaobaoImg2MasterDownloaderMiddleware': 543,'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': None,'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': None,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,'taobao_img2_master.middlewares.seleniumMiddleware': 999,'taobao_img2_master.middlewares.HttpProxyMiddleware': 998,
}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'taobao_img2_master.pipelines.TaobaoImg2MasterPipeline': 300,
}# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

python+scrapy简单爬取淘宝商品信息相关推荐

  1. python简单爬取淘宝商品信息

    爬取淘热卖商品"泡面"的信息,包括商品名称,店铺,链接,付款人数,价格等,用csv保存 import requests import csv import time import ...

  2. python使用Selenium爬取淘宝商品信息

           由于淘宝对自动化工具进行了识别,直接进入登录页面滑动二维码一直会报错,所以采取了曲线救国的方式,通过用微博账号来登录淘宝.刚自学<Python3网络爬虫开发实战>,和里面的代 ...

  3. Python爬虫+selenium——爬取淘宝商品信息和数据分析

    浏览器驱动 点击下载chromedrive .将下载的浏览器驱动文件chromedriver丢到Chrome浏览器目录中的Application文件夹下,配置Chrome浏览器位置到PATH环境. 需 ...

  4. Python,自己修改的爬取淘宝网页的代码 修改Python爬虫,爬取淘宝商品信息也不报错,也不输出信息的错误

    代码部分: 下面是正确的: import requests import redef getHTMLText(url):try:r = requests.get(url, timeout = 30)r ...

  5. Python爬取淘宝商品信息保存到Excel

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  6. python爬虫——用selenium爬取淘宝商品信息

    python爬虫--用selenium爬取淘宝商品信息 1.附上效果图 2.淘宝网址https://www.taobao.com/ 3.先写好头部 browser = webdriver.Chrome ...

  7. 使用python爬取淘宝商品信息

    使用python爬虫爬取淘宝商品信息 使用的模块主要有 selenium ,time , re, from selenium import webdriver import time import c ...

  8. 利用Selenium爬取淘宝商品信息

    文章来源:公众号-智能化IT系统. 一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样. ...

  9. 爬取淘宝商品信息selenium+pyquery+mongodb

    ''' 爬取淘宝商品信息,通过selenium获得渲染后的源码,pyquery解析,mongodb存储 '''from selenium import webdriver from selenium. ...

最新文章

  1. python列表取出元素_python中的列表,添加元素,获取元素,删除元素,列表分片,常用操作符...
  2. Python学习之zip函数
  3. uml和模式应用 pdf_「企业架构」架构知识库应用简介
  4. python读写文件错误_Python读取csv文件错误解决方法
  5. linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_lookup函数
  6. 云鹊医认证审核需要多久_ISO9001质量管理体系认证审核需要准备哪些资料
  7. .Net Discovery 系列之一--string从入门到精通(上)
  8. Java Web学习总结(44)—— RESTful 架构和 RESTful API 设计总结
  9. 小白用python处理excel文件-刚入门的小白用Python操作excel表格!使工作效率提升一倍不止!...
  10. 一个简单进程池的实现
  11. 小程序毕业设计 基于java后台微信在线考试小程序毕业设计参考
  12. 【SPSS】百分位数计算方法探讨:SPSS计算差异
  13. 工具及方法 - 如何保护眼睛
  14. 智能制造系统架构和标准体系结构
  15. RX 6500 XT参数 RX6500xt怎么样
  16. pycharm配置安装autopep8自动规范代码
  17. 全国软考中级软件设计师 复习大纲概览
  18. Java用ZIP格式压缩和解压缩文件
  19. jsp向服务器上传文件,jsp ftp 上传文件到服务器
  20. 协方差矩阵和相关系数矩阵(R语言)

热门文章

  1. CAD2010 为了保护_小学生简单又字少保护环境黑板报
  2. CSDN改变文章字体颜色,字体大小,字体型号,字体居中、居右、颜文字
  3. 蓝思科技今年第一季度营收达48亿元 同比增长6.95%
  4. python手记(四):pillow(二) ImageChops类 视觉冲击(图片像素点运算)
  5. VBA(9)合并与拆分工作本/表
  6. Excel横向打印设置
  7. CentOS 7 修改sftp端口
  8. 如何给kali安装中文输入法_中文用户名如何安装SU插件SUAPP
  9. Java基础冒泡排序(包含代码)
  10. 内核升级后linux ubuntu无线网卡wifi驱动安装上网问题