爬取思路

1.分析页面,定义爬取字段

2.观察网页,分析接口url,通过xpath和json解析爬取内容字段

3.在pipelines.py写入存储方式

4.开始爬取

5.GitHub地址:https://github.com/HAOyanWEI24/Crawler/tree/master/jingdongspider 欢迎fork和star

1.分析网页,定义字段

通过观察页面,我将字段分为了两块:一块为商品详情,包括价格名称,评论数量等等内容,另一块主要从商品得到评论,会员的相关信息,定义如下:

1.商品详情:

link = scrapy.Field() 商品链接

project_id = scrapy.Field() 商品ID

name = scrapy.Field() 商品名字

comment_num = scrapy.Field() 评论人数

shop_name = scrapy.Field() 店家名字

price = scrapy.Field() 价钱

GoodCountStr = scrapy.Field() 好评

AfterCount = scrapy.Field() 中评

PoorCount = scrapy.Field() 差评

2.评论详情:

user_name = scrapy.Field() 评论用户的名字

user_id = scrapy.Field() 评论用户的ID

userProvince = scrapy.Field() 评论用户来自的地区

content = scrapy.Field() 评论内容

good_id = scrapy.Field() 评论的商品ID

good_name = scrapy.Field() 评论的商品名字

date = scrapy.Field() 评论时间

replyCount = scrapy.Field() 回复数

score = scrapy.Field() 评分

status = scrapy.Field() 状态

userLevelId = scrapy.Field() 用户等级

productColor = scrapy.Field() 商品颜色

productSize = scrapy.Field() 商品大小

userLevelName = scrapy.Field() 银牌会员,钻石会员等

userClientShow = scrapy.Field() 来自什么 比如来自京东客户端

isMobile = scrapy.Field() 是否来自手机

days = scrapy.Field() 天数

接口思路解析:

京东网页中的很多数据是写在js中的,需要在network中查找接口路由,从而获得其真正所在的url地址,通过不同的id与接口组合得到不同的解析内容,分析如下:

分析接口:

商品价格接口分析.png

京东价格js接口url: https://p.3.cn/prices/mgets?callback=jQuery8876824&skuIds=J_4471753

Image 5.png

京东评论数量js接口url: https://club.jd.com/comment/productCommentSummaries.action?referenceIds=4471753

Image 6.png

京东评论js接口url: https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv2394&productId=6023682&score=0&sortType=5&page=2&pageSize=10&isShadowSku=0&fold=1

思路阐述,由商品list页面转入商品详情页面,解析商品的详情属性,逻辑很简单,话不多说,直接上代码

"""京东商品详情页代码"""

# -*- coding: utf-8 -*-

import requests

from jingdongspider.items import JingdongspiderItem

import scrapy

import re

import json

from scrapy import Request

class JingdongSpider(scrapy.Spider):

name = 'jingdong'

allowed_domains = ['jd.com']

start_urls = ['https://www.jd.com']

def parse(self, response):

"""京东"""

url = "https://list.jd.com/list.html?cat=670,671,672&page=1&sort=sort_totalsales15_desc&trans=1&JL=6_0_0#J_main"

yield Request(url, callback=self.parseMainPage)

def parseMainPage(self, response):

urls = response.xpath('//li[@class="gl-item"]/div/div[@class="p-img"]/a')

for url in urls:

item = JingdongspiderItem()

url = url.xpath('@href').extract()

all_url = response.urljoin(url[0])

item['link'] = all_url # 商品链接

for link in url:

url = response.urljoin(link)

yield Request(url, meta={'meta': item}, callback=self.parseDetails)

"""

通过递归原理解析下一页

下一页网页xpath解析地址

"""

next_page = response.xpath('//a[@class="pn-next"]')

for page in next_page:

pages = page.xpath('@href').extract()[0]

page = response.urljoin(pages)

print(">>>>>>>>>>>>>", page)

yield Request(page, callback=self.parseMainPage, dont_filter=True)

def parseDetails(self, response):

item = response.meta['meta']

id= response.xpath('//a[@class="compare J-compare J_contrast"]/@data-sku').extract()[0] # 商品id

item['project_id'] = id

shop_name = response.xpath('//div[@class="name"]/a/text()').extract()[0] # 商店名称

print(">>>>>>",shop_name)

item['shop_name'] = shop_name

item['name'] = response.xpath('//div[@class="sku-name"]/text()').extract()[0].strip() # 名称

"""

获取京东商品价格的url

"""

price_url = "https://p.3.cn/prices/mgets?callback=jQuery8876824&skuIds=" + str(id)

price = requests.get(price_url).text

money = re.findall(r'\"p\"\:\"(.*?)\"}]\)', price)

item['price'] = money[0]

"""

获取京东商品评论数量

"""

comment_num = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds=" + str(id)

yield scrapy.Request(comment_num, meta={'item': item}, callback=self.parse_getCommentnum)

"""

通过正则表达式解析评论人数

"""

# comment_nums = requests.get(comment_num).text

# nums = re.findall(r'\"ShowCountStr\"\:\"(.*?)\"', comment_nums)

# print(">>>>>>>", nums)

# page = urllib.urlopen(comment_num)

# data = page.read()

# print(data)

def parse_getCommentnum(self, response):

item = response.meta['item']

# response.text是一个json格式的

date = json.loads(response.text)

# print(date)

item['comment_num']= date['CommentsCount'][0]['CommentCountStr'] # 评论数量

item['AfterCount'] = date['CommentsCount'][0]['AfterCount'] # 好评

item['GoodCountStr']= date['CommentsCount'][0]['GoodCountStr'] # 中评

item['PoorCount']= date['CommentsCount'][0]['PoorCount'] # 差评

# for field in item.fields:

# try:

# item[field] = eval(field)

# except:

# print('Field is not defined', field)

yield item

"""京东评论详情页代码"""

# -*- coding: utf-8 -*-

import requests

from jingdongspider.items import commentItem

import json

import xlrd

import scrapy

from scrapy import Request

class JingdongCommentSpider(scrapy.Spider):

name = 'comment'

allowed_domains = ['jd.com']

start_urls = ['https://www.jd.com']

def parse(self, response):

"""京东"""

url = "https://list.jd.com/list.html?cat=670,671,672&page=1&sort=sort_totalsales15_desc&trans=1&JL=6_0_0#J_main"

yield Request(url, callback=self.parseMainPage)

def parseMainPage(self, response):

urls = response.xpath('//li[@class="gl-item"]/div/div[@class="p-img"]/a')

for url in urls:

url = url.xpath('@href').extract()

for link in url:

url = response.urljoin(link)

yield Request(url, callback=self.parseDetails)

def parseDetails(self, response):

id= response.xpath('//a[@class="compare J-compare J_contrast"]/@data-sku').extract()[0] # 商品id

"""

解析京东商品评论的url

"""

# url = 'https://sclub.jd.com/comment/productPageComments.action?productId=' + str(id) +'&score=0&sortType=5&page=0&pageSize=10'

# yield scrapy.Request(url, callback=self.parse_getCommentnum)

comment_num = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds=" + str(id)

com = requests.get(comment_num).text

date = json.loads(com)

comment_nums = date['CommentsCount'][0]['ShowCount']

print(comment_nums)

comment_total = int(comment_nums)

if comment_total % 10 == 0: # 算出评论的页数,一页10条评论

page = comment_total//10

else:

page = comment_total//10 + 1

for k in range(page):

'''

京东下一页评论接口

'''

com_url = 'https://sclub.jd.com/comment/productPageComments.action?productId=' + str(id) +'&score=0&sortType=5&page='+str(k)+'&pageSize=10'

# print(">>>>>>>>>>", com_url)

yield scrapy.Request(com_url, callback=self.parse_getCommentnum)

# yield scrapy.Request(com_url, callback=self.parseDetails)

def parse_getCommentnum(self, response):

js = json.loads(response.text)

# print(js)

comments = js['comments'] # 该页所有评论

items = []

for comment in comments:

item1 = commentItem()

item1['user_name'] = comment['nickname'] # 用户名

item1['user_id'] = comment['id'] # 用户id

item1['userProvince'] = comment['userProvince'] # 用户评论用户来自的地区

item1['content'] = comment['content'] # 评论

item1['good_id'] = comment['referenceId'] # 评论的商品ID

item1['good_name'] = comment['referenceName'] # 评论的商品名字

item1['date'] = comment['referenceTime'] # 评论时间

item1['replyCount'] = comment['replyCount'] # 回复数

item1['score'] = comment['score'] # 评分

item1['status'] = comment['status'] # 状态

item1['userLevelId'] = comment['userLevelId'] # 用户等级

item1['productColor'] = comment['productColor'] # 商品颜色

item1['productSize'] = comment['productSize'] # 商品大小

item1['userLevelName'] = comment['userLevelName'] # 银牌会员,钻石会员等

item1['isMobile'] = comment['isMobile'] # 是否来自手机

item1['userClientShow'] = comment['userClientShow'] # 是否来自手机

item1['days'] = comment['days'] # 天数

items.append(item1)

return items

存入数据库

"""

pipelines.pyc存储方法

"""

import MySQLdb.cursors

from twisted.enterprise import adbapi

from scrapy.utils.project import get_project_settings

SETTINGS = get_project_settings()

class MySQLPipeline(object):

@classmethod

def from_settings(cls, settings):

'''1、@classmethod声明一个类方法,而对于平常我们见到的则叫做实例方法。

2、类方法的第一个参数cls(class的缩写,指这个类本身),而实例方法的第一个参数是self,表示该类的一个实例

3、可以通过类来调用,就像C.f(),相当于java中的静态方法'''

dbparams = dict(

host=settings['MYSQL_HOST'], # 读取settings中的配置

db=settings['MYSQL_DBNAME'],

user=settings['MYSQL_USER'],

passwd=settings['MYSQL_PASSWD'],

charset='utf8', # 编码要加上,否则可能出现中文乱码问题

cursorclass=MySQLdb.cursors.DictCursor,

use_unicode=False,

)

dbpool = adbapi.ConnectionPool('MySQLdb', **dbparams) # **表示将字典扩展为关键字参数,相当于host=xxx,db=yyy....

return cls(dbpool) # 相当于dbpool付给了这个类,self中可以得

def __init__(self, dbpool):

self.dbpool = dbpool

# pipeline默认调用

def process_item(self, item, spider):

query = self.dbpool.runInteraction(self._conditional_insert, item) # 调用插入的方法

query.addErrback(self._handle_error, item, spider) # 调用异常处理方法

return item

# 写入数据库中

def _conditional_insert(self, tx, item):

sql = "insert into jingdong(project_id,name,comment_num,shop_name,link,GoodCountStr,AfterCount,PoorCount,price) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"

params = (

item["project_id"], item["name"], item["comment_num"], item["shop_name"], item["link"], item["GoodCountStr"],

item["AfterCount"], item["PoorCount"], item["price"])

tx.execute(sql, params)

# 错误处理方法

def _handle_error(self, failue, item, spider):

print('--------------database operation exception!!-----------------')

print(failue)

settings.py数据库配置

#Mysql数据库的配置信息

MYSQL_HOST = '127.0.0.1'

MYSQL_DBNAME = 'jingdong' #数据库名字,请修改

MYSQL_USER = 'user' #数据库账号,请修改

MYSQL_PASSWD = 'pwd' #数据库密码,请修改

MYSQL_PORT = 3306 #数据库端口,在dbhelper中使用

商品详情.png

评论详情 2.png

mysql好评中评统计_scrapy爬取京东笔记本及评论信息存入MySQL数据库相关推荐

  1. 爬取京东本周热卖商品基本信息存入MySQL

    爬取京东本周热卖商品基本信息存入MySQL 网络爬虫介绍 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或 ...

  2. python爬虫:爬取动态网页并将信息存入MySQL数据库

    目标网站 http://www.neeq.com.cn/disclosure/supervise.html 爬取网页该部分内容 网页分析 查看网页源代码发现没有表格部分内容,对网页请求进行分析 F12 ...

  3. Scrapy爬取重庆安居客二手房并存入mysql数据库(下)

    上篇中我们获取了重庆的一二级区(Scrapy爬取重庆安居客二手房并存入mysql数据库(上)),这一篇我们根据二级区获取相应的二手房信息. 初始化数据库 创建二手房信息数据库表,house表存放二手房 ...

  4. Scrapy爬取当当网的商品信息存到MySQL数据库

    Scrapy爬取当当网的商品信息存到MySQL数据库 Scrapy 是一款十分强大的爬虫框架,能够快速简单地爬取网页,存到你想要的位置.经过两天的摸索,终于搞定了一个小任务,将当当网的商品信息爬下来存 ...

  5. 爬虫初学——爬取京东商品的评论(一)

    最近,初学了一些爬虫的知识,然后刚好被老师要求去爬取一些评论数据(淘宝.京东等),来进行深度学习识别虚假评论.然后咋办咧,东搜搜西搜搜,看有没有什么好的办法.毕竟之前可是被反爬机制很强的网站弄得毫无头 ...

  6. python—简单数据抓取七(采取蘑菇API代理设置scrapy的代理IP池并利用redis形成队列依次使用,利用ip池访问网页并将scrapy爬取转移到items的数据存入到数据库)

    学习目标: Python学习二十七-简单数据抓取七 学习内容: 1.采取蘑菇API代理设置scrapy的代理IP池并利用redis形成队列依次使用 2.利用ip池访问网页并将scrapy爬取转移到it ...

  7. python爬携程景区评论_python爬取携程景点评论信息

    python爬取携程景点评论信息 今天要分析的网站是携程网,获取景点的用户评论,评论信息通过json返回API,页面是这个样子的 按下F12之后,F5刷新一下 具体需要URL Request的方式为P ...

  8. 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤: 1.分析网页 2.对网页发送请求,获取响应 3.提取解析数据 4.保存数据 本案例所用到的模块 import requests import ...

  9. 爬取京东商品详情页信息

    之前写过爬取京东商品导航信息,现在献上爬取京东商品详情页信息. #爬取京东商品详情页信息 #2017/7/30import requests from bs4 import BeautifulSoup ...

最新文章

  1. gcc和g++是什么,有什么区别?
  2. 【王俊杰de人工智能实战课】第6次作业
  3. python自学教程推荐-学习python中的pandas有没有好的教程推荐?
  4. l1范数最小化快速算法【文献阅读】
  5. java:8最小镜像_Java:本地最小语言
  6. 用于RIA的JavaFX 2与HTML5
  7. 程序人生:半路转行再来学软件测试,能够成为大牛吗?
  8. Safari中的代理设置(在【偏好设置中】)。
  9. P2986 [USACO10MAR]伟大的奶牛聚集(思维,dp)
  10. hbase java客户端_【HBase教程】(八)HBase JAVA 客户端API使用
  11. 软件工程之软件概要设计
  12. 2018年让你的技术学习快人一步!
  13. node使用ffmpeg拼接音频
  14. SSM网上超市购物商城管理系统、
  15. 现浇板弹性计算还是塑性计算_板塑性与弹性.doc
  16. WebDAV之葫芦儿·派盘+Solid Explorer = 全能 Android 文件管理器
  17. java画一个八卦_View绘制系列(9)-Canvas八卦图绘制
  18. require.js官方使用教程
  19. Github文件夹下载到本地
  20. android 反编译 .smali,Android_反编译_smali语法

热门文章

  1. gcc连接脚本 ld.info
  2. 万圣节元素矢量图案 Halloween Vector Pattern
  3. Thc-Ipv6 使用
  4. OneNav一为主题魔改教程(四):自定义网址内容页的Tag标签到任意位置--洞五洞洞幺
  5. Springboot2(43)轻松搞定自定义@Enable模块装配
  6. 如何在Django中优雅的使用pyecharts设计可视化BI系统(多图表)
  7. 学习笔记:运算放大器(OPA)超详细讲解(内含运用电路仿真)
  8. 小米隔空充电技术,肌肉还是鸡肋?
  9. 菲兹定律(Fitts's law)
  10. oracle 快照过旧:回退段号,ORA-01555: 快照过旧: 回退段号 39 (名称为 _SYSSMU39_3029844184$) 过小...