scrapy框架爬取京东前后一周商品信息

在这里插入图片描述打开京东的数码相机页面,进行分析,右键某个商品进行检查,发现商品详情页的链接地址
在这里插入图片描述
可以使用XPath Helper进行验证是否获取到每个商品的详情页的链接(XPath Helper插件可以在google应用商店获取)
在这里插入图片描述进入商品详情页,爬取我们需要的信息(下图是爬取商品的编号)
在这里插入图片描述

思路大概就是在京东商城的首页,在搜索栏输入数码相机,然后再获取每个数码相机的详情页,最后在详情页爬取我们需要的信息(编号,名称,店铺,产地,品牌,毛重,像素,某日的价格)

开始写代码
在cmd命令行输入 scrapy startproject jd
在进入创建的jd目录,输入 scrapy genspider jdspider jd.com

使用Pycharm打开我们刚才所创建的项目
在item.py中,写我们所需要爬取的信息

import scrapy


class JdItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

    #商品编号
    tnumber = scrapy.Field()
    #商品名称
    title = scrapy.Field()
    #价格
    price = scrapy.Field()
    #商品产地
    commodity_origin = scrapy.Field()
    #品牌
    brand = scrapy.Field()
    #商品毛重
    commodity_weight = scrapy.Field()
    #像素
    pixel = scrapy.Field()
    #店铺名
    shop = scrapy.Field()


在settings.py中配置如下信息

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

发现详情页没有我们需要的价格信息,价格信息在https://p.3.cn/prices/mgets?skuIds=J_8524940网址中,
https://p.3.cn/prices/mgets?skuIds=J_+商品编号,就是每个商品的价格信息,如下图
在这里插入图片描述
在jdspider.py中编写如下代码

# -*- coding: utf-8 -*-
import scrapy
import re
import json
import requests
from jd.items import JdItem

class JdspiderSpider(scrapy.Spider):
    name = 'jdspider'
    allowed_domains = ['jd.com']
    start_urls = ['https://search.jd.com/Search?keyword=%E6%95%B0%E7%A0%81%E7%9B%B8%E6%9C%BA']

    # 获取100页的链接
    def parse(self,response):
        for i in range(1, 7):
            next_url = "https://search.jd.com/Search?keyword=%E6%95%B0%E7%A0%81%E7%9B%B8%E6%9C%BA&page=" + str(i * 2 - 1)
            yield scrapy.Request(next_url, callback=self.parse_link)

    #获取每页详情页的链接
    def parse_link(self, response):
        #获取每个数码相机的url
        url_lists = response.xpath("//li[@class='gl-item']//div[@class='p-img']")
        for temp in url_lists:
            temp_url = "https:"+temp.xpath("./a/@href").get()
            yield scrapy.Request(url=temp_url, callback=self.parse_digital)

    #数码相机的详情页
    def parse_digital(self,response):
            item = JdItem()
            #获取商品编号
            item['tnumber'] = response.xpath("//ul[@class='parameter2 p-parameter-list']/li[2]/@title").extract_first()
            #商品名称
            item['title'] = response.xpath("//ul[@class='parameter2 p-parameter-list']/li[1]/@title").extract_first()
            #价格url
            price_url = "https://p.3.cn/prices/mgets?skuIds=J_"+str(item['tnumber'])
            res = requests.get( price_url)
            #print(price_url)
            ret = res.content.decode()
            #print(ret)
            result = json.loads(ret)
            #print(res)

            item['price'] = result[0]['p']
            # 品牌
            item['brand'] = response.xpath("//ul[@class='p-parameter-list']/li[1]/@title").extract_first()
            #print(brand)
            #商品产地
            item['commodity_origin'] = re.findall('商品产地:([\s\S]*?)</li>\n',response.text)
            #商品毛重
            item['commodity_weight'] = re.findall('商品毛重:([\s\S]*?)</li>\n',response.text)
            #像素
            item['pixel'] = re.findall('像素:([\s\S]*?)</li>\n',response.text)
            #店铺名
            item['shop'] = re.findall('店铺:([\s\S]*?)</li>\n',response.text)
            #列表转换成字符串
            shop1 = ''.join(item['shop'])
            if len(shop1)==0:
                item['shop'] = shop1

            if  len(shop1)>0:
                #将a标签去除
                shop2 = shop1.split(">")
                shop3 = shop2[1].split("<")
                item['shop'] = shop3[0]
                
            with open('shuma1.csv', 'a', encoding='utf-8') as f:
                #f.write('编号,名称,店铺,产地,品牌,毛重,像素,2020-7-3的价格\n')
                #保存数据
                f.write('{},{},{},{},{},{},{},{}\n'.format(item['tnumber'], item['title'], item['shop'], item['brand'],item['commodity_origin'],item['commodity_weight'],item['pixel'],item['price']))


爬取结果(因为有些商品信息没有店铺、产地、品牌等信息,所以有些爬取的数据是空值,需要自己手动筛选,某一天的价格信息可以累加在最后一列)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值