创建scrapy项目

  1. scrapy startproject jingdong

填充 item.py文件

在这里定义想要存储的字段信息

  1. import scrapy
  2. class JingdongItem(scrapy.Item):
  3. content = scrapy.Field()
  4. creationTime = scrapy.Field()
  5. productColor = scrapy.Field()
  6. productSize = scrapy.Field()
  7. userClientShow = scrapy.Field()
  8. userLevelName = scrapy.Field()
  9. class IdItem(scrapy.Item):
  10. id = scrapy.Field()

填充middlewares.py文件

中间件主要实现添加随机user-agent的作用。

  1. import random
  2. from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
  3. class RandomUserAgent(UserAgentMiddleware):
  4. def __init__(self, agents):
  5. self.agents = agents
  6. @classmethod
  7. def from_crawler(cls, crawler):
  8. return cls(crawler.settings.getlist("USER_AGENTS"))
  9. def process_request(self, request, spider):
  10. request.headers.setdefault('User-Agent', random.choice(self.agents))

填充pipelines.py文件

将我们爬取到的结果存储在mongo数据库中

  1. from pymongo import MongoClient
  2. class JingdongPipeline(object):
  3. collection = 'jingdong_cup'
  4. def __init__(self, mongo_uri, mongo_db):
  5. self.mongo_uri = mongo_uri
  6. self.mongo_db = mongo_db
  7. @classmethod
  8. def from_crawler(cls, crawler):
  9. return cls(
  10. mongo_uri=crawler.settings.get('MONGO_RUI'),
  11. mongo_db=crawler.settings.get('MONGO_DB')
  12. )
  13. # 爬虫启动将会自动执行下面的方法
  14. def open_spider(self,spider):
  15. self.client = MongoClient(self.mongo_uri)
  16. self.db = self.client[self.mongo_db]
  17. # 爬虫项目关闭调用的方法
  18. def close_spider(self, spider):
  19. self.client.close()
  20. def process_item(self, item, spider):
  21. table = self.db[self.collection]
  22. data = dict(item)
  23. table.insert_one(data)
  24. return "OK!"

设置settings.py文件

下面的这些信息需要简单的修改,其他的信息不动即可

  1. BOT_NAME = 'jingdong'
  2. SPIDER_MODULES = ['jingdong.spiders']
  3. NEWSPIDER_MODULE = 'jingdong.spiders'
  4. ROBOTSTXT_OBEY = False
  5. DOWNLOAD_DELAY = 2
  6. COOKIES_ENABLED = False
  7. USER_AGENTS = [
  8. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
  9. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
  10. "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
  11. "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
  12. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
  13. "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
  14. "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
  15. "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
  16. "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
  17. "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  18. "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  19. "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
  20. "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
  21. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
  22. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
  23. "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
  24. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
  25. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
  26. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
  27. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
  28. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
  29. ]
  30. DOWNLOADER_MIDDLEWARES = {
  31. 'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
  32. 'jingdong.middlewares.RandomUserAgent': 400
  33. }
  34. ITEM_PIPELINES = {
  35. 'jingdong.pipelines.JingdongPipeline': 300,
  36. }
  37. MONGO_URI = 'mongodb://localhost:27017'
  38. MONGO_DB = 'JD'

最后在创建jingdong_spider.py文件,来实现我们的逻辑

主要的逻辑是这样的,在京东首页输入商品信息之后,第一步需要做的就是将每一页的商品id爬取下来,商品的id是一串数字,我们只要将这一串数字加入到url中,就可以拿到每件商品的评论页,评论信息是josn形式返回,当然这里还需要实现翻页的功能,代码如下。

  1. from scrapy import Spider,Request
  2. from jingdong.items import JingdongItem,IdItem
  3. import json
  4. import re
  5. class JingdongSpider(Spider):
  6. name = 'jingdong'
  7. allowed_domains = []
  8. def start_requests(self):
  9. start_urls = ['https://search.jd.com/Search?keyword=%E6%96%87%E%83%B8&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.his.0.0&page={}&s=1&click=0'.format(str(i)) for i in range(1,150,2)]
  10. for url in start_urls:
  11. yield Request(url=url, callback=self.parse)
  12. # 获取商品的id
  13. def parse(self, response):
  14. selector = response.xpath('//ul[@class="gl-warp clearfix"]/li')
  15. id_list = []
  16. for info in selector:
  17. try:
  18. id = info.xpath('@data-sku').extract_first()
  19. if id not in id_list:
  20. id_list.append(id)
  21. item = IdItem()
  22. item['id'] = id
  23. comment_url = 'https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv6&productId={}&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'.format(str(id))
  24. yield Request(url=comment_url, meta={'item':item}, headers=self.headers, callback=self.parseurl)
  25. except IndexError:
  26. continue
  27. # 拿到评论页信息,解析出页面总数,针对每一个页面再次请求
  28. def parseurl(self,response):
  29. t = re.findall('^fetchJSON_comment98vv\d*\((.*)\);', response.text)
  30. json_data = json.loads(t[0]) # 字符串格式格式化成json格式
  31. page = json_data['maxPage']
  32. item = response.meta['item']
  33. id = item['id']
  34. urls = ['https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv6&productId={}&score=0&sortType=5&page={}&pageSize=10&isShadowSku=0&fold=1'.format(str(id), str(i)) for i in range(0, int(page))]
  35. for path in urls:
  36. yield Request(url=path, headers=self.headers, callback=self.parsebody)
  37. # 解析评论信息
  38. def parsebody(self,response):
  39. t = re.findall('^fetchJSON_comment98vv\d*\((.*)\);', response.text) # 去掉json的头信息,变成一个单一的列表
  40. json_data = json.loads(t[0])
  41. for comment in json_data['comments']: # 列表套字典格式
  42. item = JingdongItem()
  43. try:
  44. item['content'] = comment['content']
  45. item['creationTime'] = comment['creationTime']
  46. item['productColor'] = comment['productColor']
  47. item['productSize'] = comment['productSize']
  48. item['userClientShow'] = comment['userClientShow']
  49. item['userLevelName'] = comment['userLevelName']
  50. yield item
  51. except:
  52. continue

整体的代码可以去github下载:https://github.com/cnkai/jingdong-cup

Scrapy实战篇(四)爬取京东商城文胸信息的更多相关文章

  1. Scrapy实战篇(五)爬取京东商城文胸信息

    创建scrapy项目 scrapy startproject jingdong 填充 item.py文件 在这里定义想要存储的字段信息 import scrapy class JingdongItem ...

  2. Scrapy实战篇(八)之Scrapy对接selenium爬取京东商城商品数据

    本篇目标:我们以爬取京东商城商品数据为例,展示Scrapy框架对接selenium爬取京东商城商品数据. 背景: 京东商城页面为js动态加载页面,直接使用request请求,无法得到我们想要的商品数据 ...

  3. Scrapy实战篇(七)之Scrapy配合Selenium爬取京东商城信息(下)

    之前我们使用了selenium加Firefox作为下载中间件来实现爬取京东的商品信息.但是在大规模的爬取的时候,Firefox消耗资源比较多,因此我们希望换一种资源消耗更小的方法来爬取相关的信息. 下 ...

  4. 一个scrapy框架的爬虫(爬取京东图书)

    我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...

  5. 用scrapy爬取京东商城的商品信息

    软件环境: gevent (1.2.2) greenlet (0.4.12) lxml (4.1.1) pymongo (3.6.0) pyOpenSSL (17.5.0) requests (2.1 ...

  6. scrapy实战2分布式爬取lagou招聘(加入了免费的User-Agent随机动态获取库 fake-useragent 使用方法查看:https://github.com/hellysmile/fake-useragent)

    items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentati ...

  7. scrapy实战1分布式爬取有缘网(6.22接口已挂):

    直接上代码: items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See docu ...

  8. scrapy实战--登陆人人网爬取个人信息

    今天把scrapy的文档研究了一下,感觉有点手痒,就写点东西留点念想吧,也做为备忘录.随意写写,看到的朋友觉得不好,不要喷我哈. 创建scrapy工程 cd C:\Spider_dev\app\scr ...

  9. 使用selenium+BeautifulSoup 抓取京东商城手机信息

    1.准备工作: chromedriver  传送门:国内:http://npm.taobao.org/mirrors/chromedriver/   vpn: selenium BeautifulSo ...

随机推荐

  1. PAT 1069 The Black Hole of Numbers

    1069 The Black Hole of Numbers (20 分)   For any 4-digit integer except the ones with all the digits ...

  2. System.Web.WebPages.Html.HtmlHelper”不包含XXXX

    1.关闭Visual Studio中 2.删除bin和OBJ文件夹 3.重新打开您的解决方案

  3. 2010-10-08在浏览器中兼容+jQuery3

    一.实现背景图片铺满(兼容各种浏览器) <script type="text/javascript"> $(document).ready(function() { $ ...

  4. 【lintcode17/18】Subset, SubsetII

    题目:给定一个含不同整数的集合,返回其所有的子集. 样例:如果 S = [1,2,3],有如下的解:[[3],[1],[2],[1,2,3],[1,3],[1,2],[2,3],[]] 思路:因为此题 ...

  5. 代码统计工具-cloc

    官网地址:http://cloc.sourceforge.net/ https://sourceforge.NET/projects/cloc/files/ 下载得到cloc-1.64.exe Clo ...

  6. UVa LA 4254 - Processor 二分,贪心 难度: 1

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  7. 4 Django应用 第3部分(视图部分)

    接着昨天写的那篇笔记,今天继续学习DJango中的内容.这一章主要是介绍Django中的视图部分. 4.1视图理念 4.2编写第一个视图 4.3编写更多的视图 4.4给视图编写功能 4.5render ...

  8. 18-10-08 对Excel 表格添加颜色

    #-*- coding:utf-8 -*-#首先注意一个问题 pycharm 中路径符号和Linux 系统一样向左import xlwt def add_color(): #实例化对象 增加sheet ...

  9. javascript性能优化之避免二次评估

    Javascript与许多脚本语言一样,允许你在程序中获取一个包含代码的字符串然后运行它,有多种方式可以实现在一串Javascript代码并运行它. 代码示例如下 <html> <h ...

  10. JQuery 实现导航菜单的高亮显示

    需求是这样的 点击不同的导航菜单实现当前点击的菜单是高亮的,点击导航下面的某个分类,分类所属的导航也必须是高亮的,点击某一篇文章,文章所属的导航菜单也必须是高亮的. 网上说的思路是这样的: 在菜单层的 ...