爬取流程分析

京东有点好就是有个领券中心,所有购物券都集中在一个页面,可以通过scrapy等爬虫框架很容易的爬取。其中,一个购物券部分的代码如下:

...
...

...
...

这段代码中 class = price 和 range 的部分包含了购物券的信息,而 data-linkurl 属性的值则是该优惠券适用的商品。这种结构非常适合于用xpath或beautifulsoup等进行语义分析,只需要爬取领券中心的100页的信息,并且跟踪data-linkurl就可以获取有优惠券的商品。说干就干,把初学python时用过的scrapy翻出来练练手。

Scrapy简介

scrapy是一个爬虫框架,在今年年初更新到了python3的版本,因此就用py3开撸,顺便看看scrapy对py3的支持怎么样。对于框架这种东西,在初学时是给我造成了不小的困扰,和使用模块时一点一点增量式的搭建不一样,scrapy这种框架更多的工作是配置工作,因为很多东西是scrapy在框架里提供了,需要按照scrapy的工作流去补充需要的功能。空讲无益,先看看scrapy的架构的流程图。

架构概览的详细资料可以看官方文档,简单的说就是Spiders将Requests注册到Scheduler,Scheduler控制下载队列去下载网页,返回一个Response给Spiders,Spiders处理之后将items交给后端。

具体到代码中就是继承一个scrapy.Spider类,该类默认parse函数为核心的处理接口。从默认的starturl下载的response在这个函数里解析,用xpath等解析出来的items可以在这里返回,返回到pipeline里自定义的数据库接口中去。如果需要跟踪二级链接,则需要返回一个Requests重新将二级链接注册到下载队列,并设置二级链接的回调函数。在初学scrapy和这次编写JD的爬虫时都遇到没有爬取二级链接的情况,鼓捣了半天发现原因是没有返回Requests或没有在parse中返回。

Spider类默认是将response给到parse函数,也可以在start_requests函数中返回Requests来自定义回调函数。无论是默认的parse函数还是自定义的回调函数,如果返回items,dict或Requests,都会有spider的后处理动作,无返回值不会,所以一旦spider抓取有问题,就看看parse函数的返回值是不是都正常返回了,而且是要在parse这一级的函数里返回,子函数返回不算。

总而言之,这个框架的数据流中的中心节点接口是parse函数,比较有用的方法是Requests方法,多注意parse函数的返回值有木有问题。

代码

源代码已经上传到github,主要代码在coupons\spiders\coupons_spider.py中:

import scrapy

from coupons.items import CouponsItem

import json

class CouponsSpider(scrapy.Spider):

name = "coupons"

allowed_domains = ['jd.com']

start_urls = ["http://a.jd.com/coupons.html?page={}"\

.format(x) for x in range(1, 100)]

def parse(self, response):

pages = response.xpath("//*[@class=\"quan-item quan-d-item quan-item-acoupon\"]")

for page in pages:

metadata = self._xpathCounponsMetaData(page)

url = 'http://'+ metadata['dataLinkurl'][0]

yield scrapy.Request(url=url, meta=metadata, callback= self.classify)

def _xpathCounponsMetaData(self,page):

"""xpath rules"""

...

def classify(self, response):

"""second url callback"""

...

def _parseGoods(self, response):

"""second url xpath rules"""

...

def close(spider, reason):

"""scrapy's work is down, proccessing data"""

...

基本流程就是在start_urls里设置好爬取的一级网址列表,默认的parse()爬取,_xpathCounponsMetaData()解析html,在parse中设置二级链接的回调函数为classify(),classify()中的_parseGoods解析html,classify()返回一个items供pipelines后处理。最后在close中处理爬取完所有链接后的数据。注意别忘了在items.py中设置items,在settings.py中注册好pipelines,在pipelines里我就简单的搞了哥json保存,没有用数据库,在后面可以改进。

写在最后

写完了发现这个东西并没那么好用,虽然可以查询哪些商品有优惠券,却不能通过优惠券信息对应到该优惠券,只能手动筛选,还是挺鸡肋的,权当练手了。

优惠券中心虽然有一百页,但二级链接中基本只有seach开头的链接是比较有价值的,因此,并不用爬取一百页。而且二级链接中也是分页的,我只爬取了第一页,应该漏了很多信息。

京东app优惠券python抓取_备战双十一,scrapy框架爬取京东优惠券信息相关推荐

  1. python爬取链家网实例——scrapy框架爬取-链家网的租房信息

    说明: 本文适合scrapy框架的入门学习. 一.认识scrapy框架 开发python爬虫有很多种方式,从程序的复杂程度的角度来说,可以分为:爬虫项目和爬虫文件. scrapy更适合做爬虫项目,ur ...

  2. python中scrapy可以爬取多少数据_python中scrapy框架爬取携程景点数据

    ------------------------------- [版权申明:本文系作者原创,转载请注明出处] 文章出处:https://blog.csdn.net/sdksdk0/article/de ...

  3. python爬虫十二:初步使用Scrapy框架爬取数据

    1.通过pipelines操作拿到的数据 要点一:爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作,当运行爬虫文件之后执行的顺序如下图简介,如果重写模块或者内部方法可能 ...

  4. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  5. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  6. 利用python的scrapy框架爬取google搜索结果页面内容

    scrapy google search 实验目的 爬虫实习的项目1,利用python的scrapy框架爬取google搜索结果页面内容. https://github.com/1012598167/ ...

  7. python爬虫——用Scrapy框架爬取阳光电影的所有电影

    python爬虫--用Scrapy框架爬取阳光电影的所有电影 1.附上效果图 2.阳光电影网址http://www.ygdy8.net/index.html 3.先写好开始的网址 name = 'yg ...

  8. Python的Scrapy框架爬取诗词网站爱情诗送给女友

    文章目录 前言 效果展示: 一.安装scrapy库 二.创建scrapy项目 三.新建爬虫文件scmg_spider.py 四.配置settings.py文件 五.定义数据容器,修改item.py文件 ...

  9. Python爬虫 scrapy框架爬取某招聘网存入mongodb解析

    这篇文章主要介绍了Python爬虫 scrapy框架爬取某招聘网存入mongodb解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建项目 sc ...

  10. python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战

    先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...

最新文章

  1. java与ios的区别_好奇?Android与iOS究竟有什么区别?终于知道了!
  2. python requests_Python爬虫之requests模块
  3. 20190405模拟测试
  4. SAP中各种分摊分配方法
  5. 第04课:深度学习框架 PyTorch
  6. bat脚本保存dir结果_Tomcat的启停脚本源码解析
  7. 一种编程范式:对拍编程
  8. 使用手机模拟器与android操作系统
  9. 《A.I.爱》王力宏与人工智能谈恋爱 邀李开复来客串
  10. [lammps教程] lammps建立纳米管模型
  11. 换硬币-零钱换成5分、2分和1分的硬币
  12. python调用openapi_eleme.openapi.python.sdk · PyPI
  13. python上方菜单栏不见了如何恢复_CorelDRAW菜单栏不见了,如何恢复
  14. 神经网络学说的主要观点,神经网络宏观解释包括
  15. 一维条形码Code128的编码与生成
  16. Error: com.android.ide.common.process.ProcessException
  17. 图像识别——AlexNet原理解析及实现
  18. 猫眼电影MySQL数据库怎么写_Python3爬取猫眼电影榜并将数据存入MySql
  19. pytorch 利用tensorboard显示loss,acc曲线等
  20. 用不规则矢量多边形裁切栅格数据的方法比较

热门文章

  1. Excel如何根据身份证号码提取出性别
  2. python的模块和包
  3. 2019年苏大计算机考研872真题及解析
  4. srs之服务搭建+OBS推流(简单记录)
  5. java有序的Map-LinkedHashMap
  6. 【Vue脚手架安装教程】
  7. 故障:PDF 文件打印失败
  8. VREP学习记录(持续更新)
  9. distpicker省市区插件设置请选择省市区提示/或设置初始值问题
  10. 形式语言与自动机第二课