爬取大华产品信息
欢迎关注我的公众号「测试游记」
由于想要了解一下友商的产品信息,所以简单的写一下爬取他们信息的爬虫
创建项目
1 | scrapy startproject Dahua |
产品类别url地址为:http://www.dahuatech.com/product.html
所以修改开始的urlstart_urls
1 | class DahuaSpider(scrapy.Spider): |
需要爬取的为设备的具体信息
- 产品详情地址
- 产品名称
- 产品描述
- 产品概述
- 技术参数
- 尺寸图
- 订货型号
所以先在Dahua/items.py
写上
1 | import scrapy |
获取设备类型列表
从第一个页面可以看出,设备分成了很多大类,大类中又有很多的小类
所以我们先拿到全部小类的url地址
使用XPath Helper
工具进行Xpath
定位
由于我懒得解析太多Xpath,所以我取用了离要获取的url最大层级的div
标签
对应的URL的Xpath为://div[@class='product-channel-list f-cb']//a/@href
对呀的文字的Xpath为://div[@class='product-channel-list f-cb']//a/text()
所以爬虫中第一个解析函数parse
1 | def parse(self, response): |
获取设备列表
任意点击一个小类进入如下页面
包含了设备名称
,描述信息
。
查看详情
按钮是进入设备详情页的
所以这儿需要获取到3个Xpath
全部的查看详情
://li//span[1]//a/@href
全部的设备名称
://div[@class='product-list-b']//ul[@class='f-cb']//h3/text()
全部的描述信息
://div[@class='product-list-b']//ul[@class='f-cb']//a/p[1]/text()
所以代码为:
1 | def parse_productlist(self, response): |
往处理详情页的地方传入了product_name
和product_description
也就是设备名称,设备描述
由于部分页面有多页,所以也做了页面的跳转
1 | page_list = response.xpath("//div[@class='news-page w1400']//a/@href").extract() |
本来这里要处理重复页面的,但是由于Scrapy
自带了缓存机制,它会跳过爬取相同的url
,所以就这样了~
获取详情页
进入详情页后发现数据是动态出现的,使用抓包的方式很容易可以发现它应该ajax请求的方式刷新数据
当前页面:https://www.dahuatech.com/product/info/93.html
ajax
请求页面:https://www.dahuatech.com/ajax/product/93/1
其中相同的部分为93
由于我懒得再爬一层,所以直接用requests
发起了get
请求
1 | def parse_productdetail(self, response): |
数据持久化
使用最简单的数据持久化方式:写入json
修改Dahua/pipelines.py
1 | import json |
一次爬取分为三步:
- 打开
dahua.json
文件 - 写入内容
- 关闭
dahua.json
文件
修改Dahua/settings.py
- 关闭君子协议
1 | ROBOTSTXT_OBEY = False |
- 开启数据持久化部分
1 | ITEM_PIPELINES = { |
查看结果
在外部使用
1 | scrapy crawl dahua |