Scrapy+Redis+MySQL分布式爬取商品信息

  • A+
所属分类:Python

Scrapy+Redis+MySQL分布式爬取商品信息_慕课手记

Scrapy+Redis+MySQL分布式爬取商品信息

目录
第一步 创建并配置scrapy项目
第二步 将数据导出至json文件和MySQL数据库
第三步 设置随机访问头User-Agent
第四步 配置scrapy-redis实现分布式爬虫


开发环境

  • 电脑系统:macOS High Sierra
  • Python第三方库:scrapy、pymysql、scrapy-redis、redis、redis-py
  • Python版本:Anaconda 4.5.8 ,集成Python版本 3.6.4
  • 数据库: MySQL 8.0.11、redis 4.0.1

第一步 创建scrapy项目

cmd输入:
scrapy startproject taobaocd taobao
scrapy genspider -t basic tb taobao.com

1. 爬虫程序编写tb.py

  • 在源代码的基础上添加了销量、产品描述信息的爬取;
  • 更新了url分类判断的方式;
  • 抓包取得的评论数网页格式有变化,更新了正则表达式。

-- coding: utf-8 --import scrapyimport refrom scrapy.http import Requestfrom taobao.items import TaobaoItemimport urllib.requestclass TbSpider(scrapy.Spider):

name = 'tb'
    allowed_domains = ['taobao.com']
    start_urls = ['http://taobao.com/']    def parse(self, response):
        key = input("请输入你要爬取的关键词\t")
        pages = input("请输入你要爬取的页数\t")
        print("\n")
        print("当前爬取的关键词是",key)
        print("\n")        for i in range(0, int(pages)):

url = "https://s.taobao.com/search?q=" + str(key) + "&s=" + str(44*i)            yield Request(url=url, callback=self.page)        pass

#搜索页
    def page(self,response):
        body = response.body.decode('utf-8', 'ignore')
        pat_id = '"nid":"(.?)"'    #匹配id
        pat_now_price = '"view_price":"(.
?)"'      #匹配现价格
        pat_address = '"item_loc":"(.?)"'      #匹配商家地址
        pat_sale = '"view_sales":"(.
?)人付款"' #销量
        all_id = re.compile(pat_id).findall(body)
        all_now_price = re.compile(pat_now_price).findall(body)
        all_address = re.compile(pat_address).findall(body)

all_sale = re.compile(pat_sale).findall(body)        for i in range(0, len(all_id)):

this_id = all_id[i]
            now_price = all_now_price[i]
            address = all_address[i]
            sale_count = all_sale[i]

url = "https://item.taobao.com/item.htm?id=" + str(this_id)            yield Request(url=url, callback=self.next, meta={ 'now_price': now_price, 'address': address,'sale_count':sale_count})            pass

pass
    #详情页
    def next(self, response):
        item = TaobaoItem()
        url = response.url
        #由于淘宝和天猫的某些信息采用不同方式的Ajax加载,做一个分类
        if 'tmall' in url:  #天猫、天猫超市、天猫国际

title = response.xpath("//html/head/title/text()").extract()  #获取商品名称

#price = response.xpath("//span[@class='tm-count']/text()").extract()

#这里获取商品原价格-但一直抓到的是空值,Xpath在xpath finder里验证有效,暂时不知道为什么。。。由于后续会影响到数据库的写入,暂时隐了

#以下是产品描述信息栏内的信息获得,检索文字标签获得对应内容:

brand = response.xpath("//li[@id='J_attrBrandName']/text()").re('品牌:\xa0(.*?)

5d9bf1e854252b068700002a_html_.png

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin