爬取流程分析

京东有点好就是有个领券中心,所有购物券都集中在一个页面,可以通过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. python运维之轻松模拟开发FTP软件05
  2. JAVA 的 Date、Calendar的常用用法
  3. 51单片机驱动ds12887c语言,51单片机+DS12887+12864大数字时钟程序+电路
  4. 文字打印机 效果实现
  5. C#中的多线程 - 同步基础
  6. 软工作业PSP与单元测试训练
  7. HDU 2818 Building Block
  8. hadoop 集群启动时 Address already in use 解决方法
  9. c#进阶之lambda表达式
  10. java+JNI 生成包头文件与调用实例
  11. 如何注释ascx中的代码
  12. Windows应用程序组成及编程步骤
  13. Linux建立虚拟ip的方法
  14. Tomcat下载——tomcat7、tomcat8、tomcat9官网下载链接
  15. 主力用计算机吸筹,通达信主力吸筹指标
  16. 畅销书排行榜html作业,制作畅销书排行榜.html
  17. 使用inkscape制作logo
  18. 手机测试中的ICCID是什么?
  19. Intel和AMD处理器各有什么特点?该如何选择?
  20. window Azure 部署java 应用

热门文章

  1. OSG绘制空间凹多边形以及透明效果的实现
  2. 实施成功的ITIL变更管理的6个步骤
  3. 宏观经济的基本指标及其衡量
  4. java使用RXTX的详细总结
  5. 基于FOC矢量算法的MTPA控制在变频洗衣机上的应用
  6. c programe language learn notes 3
  7. testbed常见问题及处理(1)
  8. 斐讯K2破解任意校园网教程
  9. 如何提取差异脑区的灰质体积与临床量表算相关?——基于体素的形态学方法(VBM)
  10. crt导出服务器文件,CRT中将服务器中生成的awr报告用会话日志提取到本地