京东app优惠券python抓取_备战双十一,scrapy框架爬取京东优惠券信息
爬取流程分析
京东有点好就是有个领券中心,所有购物券都集中在一个页面,可以通过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框架爬取京东优惠券信息相关推荐
- python爬取链家网实例——scrapy框架爬取-链家网的租房信息
说明: 本文适合scrapy框架的入门学习. 一.认识scrapy框架 开发python爬虫有很多种方式,从程序的复杂程度的角度来说,可以分为:爬虫项目和爬虫文件. scrapy更适合做爬虫项目,ur ...
- python中scrapy可以爬取多少数据_python中scrapy框架爬取携程景点数据
------------------------------- [版权申明:本文系作者原创,转载请注明出处] 文章出处:https://blog.csdn.net/sdksdk0/article/de ...
- python爬虫十二:初步使用Scrapy框架爬取数据
1.通过pipelines操作拿到的数据 要点一:爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作,当运行爬虫文件之后执行的顺序如下图简介,如果重写模块或者内部方法可能 ...
- Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...
- Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...
- 利用python的scrapy框架爬取google搜索结果页面内容
scrapy google search 实验目的 爬虫实习的项目1,利用python的scrapy框架爬取google搜索结果页面内容. https://github.com/1012598167/ ...
- python爬虫——用Scrapy框架爬取阳光电影的所有电影
python爬虫--用Scrapy框架爬取阳光电影的所有电影 1.附上效果图 2.阳光电影网址http://www.ygdy8.net/index.html 3.先写好开始的网址 name = 'yg ...
- Python的Scrapy框架爬取诗词网站爱情诗送给女友
文章目录 前言 效果展示: 一.安装scrapy库 二.创建scrapy项目 三.新建爬虫文件scmg_spider.py 四.配置settings.py文件 五.定义数据容器,修改item.py文件 ...
- Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
这篇文章主要介绍了Python爬虫 scrapy框架爬取某招聘网存入mongodb解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建项目 sc ...
- python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战
先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...
最新文章
- python运维之轻松模拟开发FTP软件05
- JAVA 的 Date、Calendar的常用用法
- 51单片机驱动ds12887c语言,51单片机+DS12887+12864大数字时钟程序+电路
- 文字打印机 效果实现
- C#中的多线程 - 同步基础
- 软工作业PSP与单元测试训练
- HDU 2818 Building Block
- hadoop 集群启动时 Address already in use 解决方法
- c#进阶之lambda表达式
- java+JNI 生成包头文件与调用实例
- 如何注释ascx中的代码
- Windows应用程序组成及编程步骤
- Linux建立虚拟ip的方法
- Tomcat下载——tomcat7、tomcat8、tomcat9官网下载链接
- 主力用计算机吸筹,通达信主力吸筹指标
- 畅销书排行榜html作业,制作畅销书排行榜.html
- 使用inkscape制作logo
- 手机测试中的ICCID是什么?
- Intel和AMD处理器各有什么特点?该如何选择?
- window Azure 部署java 应用