首页 编程教程正文

初学scrapy之自动爬取京东所有商品信息(附存入数据库操作)

piaodoo 编程教程 2020-02-22 22:07:28 911 0 python教程

本文来源吾爱破解论坛

1.cmd命令行下创建crwal自动爬虫:
scrapy startproject 项目名
scrapy gensipder -t crawl 爬虫名 网站域名
2.代码


2.1 在item.py中初始化相关容器Id=scrapy.Field()
title=scrapy.Field()
price=scrapy.Field()
link=scrapy.Field()
detail=scrapy.Field()
#评价数量
comment=scrapy.Field()
2.2 爬虫代码
# -*- coding: utf-8 -*-
import re
import urllib

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.http import Request
from learning.JD.JD.items import JdItem

class JdspiderSpider(CrawlSpider):
    name = 'jdSpider'
    allowed_domains = ['jd.com']
    # start_urls = ['https://www.jd.com/']
    def start_requests(self):
        hearder=hearder={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0"}
        yield Request('https://www.jd.com/',headers=hearder,)

    rules = (
        #教案给出来的是不设置过滤规则,将所有的网页都爬取下来后再利用正则表达式判断是不是商品展示页面
        Rule(LinkExtractor(allow=''), callback='parse_item', follow=True),
        #自己试验发现所有商品页url中都有item关键字
        # Rule(LinkExtractor(allow='item'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        try:
            item = JdItem()
            #获取当前正在爬取的页面
            thisUrl=response.url
            print("######"+thisUrl)
            pat='item.jd.com/(.*?).html'
            #判断当前正在爬取的页面是不是商品页面,及商品页面url的格式是否符合
            y=re.search(pat,thisUrl)
            if (y):
                thisId=re.compile(pat).findall(thisUrl)[0]
                #这些是直接能从网页当中得到的信息
                item["Id"]=thisId
                print("正在爬取的商品id为:"+thisId)
                item["title"]= response.xpath("//html/head/title/text()").extract()
                print("当前商品标题为:"+item["title"][0])
                item["link"]=response.xpath('//html/head/link[@rel="canonical"]/@href').extract()
                print("当前商品连接为:"+item["link"][0])
                item["detail"] = response.xpath('//div[@class="p-parameter"]//li//text()').extract()
                print("当前商品细节为:"+item["detail"][0])
                #这些是必须要通过抓包而分析才能获取到的信息
                #根据商品id拼接得到将要爬取的url
                priceUrl="https://c0.3.cn/stock?skuId="+thisId+"&area=22_1930_49322_0&venderId=1000004259&buyNum=1&choseSuitSkuIds=&cat=9987,653,655&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_6401fe2b172db&pduid=15661949259061415596451&ch=1&callback=jQuery1517076"
                commentUrl="https://club.jd.com/comment/productCommentSummaries.action?referenceIds="+thisId+"&callback=jQuery4229677&_=1567588862109"
                #根据拼接的url得到网页中的数据(json数据),再通过正则表达式进行提取
                priceData=urllib.request.urlopen(priceUrl).read().decode("utf-8","ignore")
                commentData=urllib.request.urlopen(commentUrl).read().decode("utf-8","ignore")
                # print("commentData为:"+commentData)
                patP='"p":"(.*?)"'
                patC='"CommentCount":(.*?),'
                item["price"]= re.compile(patP).findall(priceData)
                print("当前商品价格为:"+item["price"][0])
                item["comment"]= re.compile(patC).findall(commentData)
                print("当前商品评论为:"+item["comment"][0])
                if(len(item["Id"]) and len(item["title"])and len(item["link"]) and len(item["detail"]) and len(item["price"]) and len(item["comment"])==0):
                    print("有商品页的所有信息都无法捕获")
                if(len(item["Id"]) or len(item["title"]) or len(item["link"]) or len(item["detail"]) or len(item["price"]) or len(item["comment"])==0):
                    print("该商品的部分信息没有爬取到")

            else:
                pass
        except:
            print("爬虫出错")

        return item
2.3数据库操作,在pipilines.py中完成
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import pymysql

class JdPipeline(object):
    def process_item(self, item, spider):
        con=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="python")

        for i in range(0,len(item["Id"])):
            # print("$$@#$@$@#@$"+str(item["detail"]))
            #detail是以列表的形式存储的,这种方式智能插入列表第一个元素,不能插入所有元素
            # sql="insert into jd(goodsId,title,link,detial,price,commentCount) values ('%s','%s','%s','%s','%s','%s')" %(
            #     item["Id"],item["title"],item["link"],detail,item["price"],item["comment"]
            # )

            #detail中的数据转化为字符串的形式进行存储,再写入数据库中,并且不加下标,可以存入所有的元素
            detail=" ".join(item["detail"])
            sql="insert into jd(goodsId,title,link,detial,price,commentCount) values ('%s','%s','%s','%s','%s','%s')" %(
                item["Id"],item["title"],item["link"],detail,item["price"],item["comment"]
            )
            print("sql为:"+sql)
            con.query(sql)
        con.close()
        return item




版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7608.html

搜索