框架目标:写最少的代码,实现定制化抓取需要掌握技能xpath表达式,正则表达式,以及css表达式,至少会其中一项python 字典和列表数据结构以下技能最好掌握python lambda 表达式的使用python 简单函数编写了解scrapy的基本概念,参见scrapy简单介绍抓取国外81个电商网站70W商品SKU(库存量单位)信息抓取国内各大招聘网站各行业的职位信息抓取不可描述的网站上各种不可描述的图片及下载链接以下是干货:这是小编准备的py thon学习资料,想学习py thon或者人工智能的都可以私信小编“01”获取学习资料
手把手教你实现网站分类下项目信息的抓取我们以bluefly为例进行讲解(声明声明,本文不是bluefly的软文,bluefly不是指蓝翔,虽然我是山东的,更是济南的,但你们问我挖掘机的事情,宝宝表示一脸萌比)一、安装web-walker需要python2.7git clone https://github.com/ShichaoMa/webWalker.gitcd webWalker/walker && (sudo) python setup.py installor(sudo) pip install web-walker可以直接从git上clone代码,但更推荐使用pip安装,windows 系统和ubuntu系统均支持二、配置抓取信息打开你要抓取网站,找到一个你要抓取项目的分类比如,我们选择woman shirt一共找到了910个商品, 我们要把每一件shirt的商品信息都抓取下来首先我们打开浏览器开发者工具F12,推荐使用chrome浏览器,找到下一页的xpath表达式不懂xpath的可以看这里,一个非常简单的XML路径语言,用来寻找网页中的元素,很容易学习XPath 教程注意:现在的开发者工具都会有copy xpath这个功能,但不推荐使用,因为copy出来的xpath专一性很强可能你抓取其它商品或者其它页的时候,xpath已经不适用了,使用id ,标签名,加上class去匹配一个xpath路径,会更通用一些我们找到的结果是'//[@id=\"page-content\"]//a[@rel=\"next\"]/@href'好的,先记下来,一会儿用来配置然后,我们找到商品链接的xpath表达式我们找到的结果是'//ul[@class=\"mz-productlist-list mz-l-tiles\"]/li//a[@class=\"mz-productlisting-title\"]/@href'保存起来接下来,我们点开商品链接,在商品页面寻找我们需要的信息让我们一个一个找到这些信息所在位置'//p[@class=\"mz-productbrand\"]/a/text()'# 商标'//span[@class=\"mz-breadcrumb-current\"]/text()'# 标题'//[@id=\"product-selection\"]//div[@itemprop=\"price\"]/text()'# 原价'//[@id=\"product-selection\"]//div[@class=\"mz-price is-saleprice\"]/text()'# 现价'//div[@class=\"mz-productoptions-valuecontainer\"]/span/text()'# 尺寸'//div[@class=\"mz-productoptions-optioncontainer colorList\"]/div/span/text()'# 颜色'//li[@itemprop=\"productID\"]/text()'# 商品唯一id......当然,你还可以抓取其它信息好了,在有这些信息之后,让我们开始配置我们的程序吧使用scrapy生成一个项目ubuntu@dev:~/myprojects$ scrapy startproject demoNew Scrapy project 'demo' created in: /home/ubuntu/myprojects/demoYou can start your first spider with: cd demo scrapy genspider example example.com# 目录结构如下.├── demo│ ├── __init__.py│ ├── items.py│ ├── pipelines.py│ ├── settings.py│ └── spiders│ └── __init__.py└── scrapy.cfg或者直接从test中复制myapp,如果要改项目名字,记得修改scarpy.cfg中的名字删除掉其中的demo/items.py demo/piplines.py,并使用myapp/settings.py,myapp/spipders/__init__.py 替掉原来的文件在spiders目录下,创建page_xpath.py, item_xpath.py, item_field.py, spiders.py,编写以下内容# spiders.py# -- coding:utf-8 -SPIDERS = { # 配置spider, spider名称一个字典,字典中为这个spider的一些自定义属性,可为空 \"bluefly\": {}}# page_xpath.py# -- coding:utf-8 -PAGE_XPATH = { # 配置网站分类页中获取下一页链接的方式,具体策略参见wiki \"bluefly\": [ '//[@id=\"page-content\"]//a[@rel=\"next\"]/@href', ]}# item_xpath.py# -- coding:utf-8 -ITEM_XPATH = { # 配置网站分类页中获取商品页链接的方式,xpath表达式 \"bluefly\": [ '//ul[@class=\"mz-productlist-list mz-l-tiles\"]/li//a[@class=\"mz-productlisting-title\"]/@href', ]}# item_field# -- coding:utf-8 -ITEM_FIELD = { # 商品页中,所需信息的获取方式,具体策略参见wiki \"bluefly\": [ ('product_id', { \"xpath\": [ '//li[@itemprop=\"productID\"]/text()', ], }), ('brand', { \"xpath\": [ '//p[@class=\"mz-productbrand\"]/a/text()', ], }), ('title', { \"xpath\": [ '//span[@class=\"mz-breadcrumb-current\"]/text()', ], }), ('price', { \"xpath\": [ '//[@id=\"product-selection\"]//div[@itemprop=\"price\"]/text()', ], }), ('new_price', { \"xpath\": [ '//[@id=\"product-selection\"]//div[@class=\"mz-price is-saleprice\"]/text()', ], }), ('size', { \"xpath\": [ '//div[@class=\"mz-productoptions-valuecontainer\"]/span/text()', ], }), ('color', { \"xpath\": [ '//div[@class=\"mz-productoptions-optioncontainer colorList\"]/div/span/text()', ], }), ]}修改demo/settings.py 文件,或者直接新建localsettings.py,增加自定义配置,要修改的项目在settings.py已注明配置完毕,接下来我们就要开始抓取了三 启动我们的程序启动redis#如果没有安装redis,可以使用自带的custom-redis,配置文件中需写明CUSTOM_REDIS=Truecustom-redis-server -p 6379注:cutom-redis是我实现的python 版的简单redis 参见GitHub - ShichaoMa/custom_redis: python实现简单redis,实现redis基本功能以及可插拔数据结构启动爬虫cd demoscrapy crawl bluefly投放任务# 使用自带的costom-redis 需要加上 --custom# 投放分类链接feed -c test_01 -s bluefly -u \"http://www.bluefly.com/women/clothing/skirts\" --custom爬虫在努力的工作中可以在配置文件中配置是将log打到控制台,文件还是kafka(用来关联elk做日志管理)中查看任务状态# 使用自带的costom-redis 需要加上 --customcheck test_01 --custom总数居然只有96,有没有搞错
或许你看到这个结果时,第一反应就是这样的,但是,请相信我可以解释这一切当你不对scrapy做任何限制的时候,scrapy会同时下载十几个网页(具体看配置),抓取速度可能会很快,这样的就会导致,下一页还没翻完,当前页的商品已经差不多抓取完毕了,所以才会这种现象出现全部商品抓取完毕,至于为什么刚才是910,现在只有907那是因为这些电商网站的商品数量会经常变化,不要在意这些细节如果你没有更改pipline配置,会默认使用JSONPipline进行数据存储,关闭程序后,会在程序的项目根目录task文件夹下生成json格式的文件用来存储抓取信息作者:亲故_58a1链接:https://www.jianshu.com/p/181289952309来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处
(图片来源网络,侵删)
0 评论