1. 京东网站的搜索页是(https://search.jd.com/),它有个比较方便的点,是它不需要用户登陆即可搜索(不像某宝网,必须要登陆后才能搜索)
2. 本文使用的服务器是阿里云服务器(前几天双十一搞活动买的,CentOS系统,1核2G,40G存储空间,自己耍足够了),使用 Putty 可以远程连接服务器。
3. 本文使用的数据库是 MongoDB 数据库,使用 Robo 3T 可以比较方便的查看管理数据库。
4. 本爬虫是学习《PeekpaHub 全栈开发》 教程而开发的,实践后收获很大。
5. 本爬虫使用到的库有 scrapy ,bs4 ,pymongo ,scrapyd-client ,请自行安装。
爬虫部分
一、创建 Scrapy 工程
1. 新建 Scrapy 项目。打开终端(Terminal 或 cmd),使用 cd 命令进入自己要创建工程的目录,然后输入以下命令,创建爬虫项目(如:我的项目名叫 SmartCraneHub )
$ scrapy startproject SmartCraneHub
2. 创建爬虫文件。使用 cd 命令进入项目文件夹中,然后执行以下命令,按照模板创建我们的爬虫文件(如:我的爬虫名叫 SmartHub )
$ cd SmartCraneHub
$ scrapy genspider SmartHub http://www.baidu.com
3. 使用 pycharm 打开 scrapy 项目( pycharm 里的 python 环境请自行设置), 查看目录结构如下。
创建 Scrapy 工程时,会根据模板自动生成一些文件(图中框出来的),这里简单说一下这些文件时做什么用的:
- SmartHub.py —— 这个是我们的爬虫文件,主要的爬虫代码均在这里编写。
- items.py —— 这个是定义爬到的数据的数据结构的,在爬虫爬取到数据之后,需要把数据封装成这里预先定义好的对象。
- middlewares.py —— 这个是 scrapy 的中间件文件,这里的代码主要是在爬虫运行期间执行的操作,比如添加表头,设置代理等。
- pipelines.py —— 这个主要是对 item 的处理,比如将数据添加到数据库中,或者写入文件里,这些操作都在这里进行。
- setting.py —— 这个是 scrapy 框架的配置文件。
- scrapy.cfg —— 这个是部署 scrapy 的配置文件,和 scrapyd 和 scrapyd-client 一起使用。
4. 编辑爬虫文件,设置初始 url 。打开 SmartHub.py 文件,默认的内容大致如下:(由于我们创建爬虫文件时网址写的是 百度,这里需要自行改成自己要爬的目标 url )
import scrapy
class SmarthubSpider(scrapy.Spider):
name = 'SmartHub'
allowed_domains = ['search.jd.com']
start_urls = ['https://search.jd.com/Search?keyword=%E9%9B%B6%E9%A3%9F&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=lingshi&stock=1&click=0&page=1']
def parse(self, response):
pass
5. 到此我们的爬虫程序框架已经完成了,在 Terminal 中执行以下命令,运行爬虫程序:
$ scrapy crawl SmartHub
这里为了方便运行,我们在 scrapy.cfg 文件同级的地方,创建一个 Run.py 文件,写入以下代码:
from scrapy import cmdline
def main():
cmdline.execute("scrapy crawl SmartHub".split())
if __name__ == '__main__':
main()
这样,之后每次只要运行 Run.py 文件,即可直接执行我们的爬虫了。
二、分析网页结构
我们这次要爬的是京东商城,零食的页面,网址为:https://search.jd.com/Search?keyword=%E9%9B%B6%E9%A3%9F&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=lingshi&stock=1&click=0&page=1
1. 明确数据结构
观察网站,看看上面有什么我们可以获取的数据。
分析之后,我们决定爬取以下的数据:
- 零食的品牌
- 零食的ID
- 零食的名字
- 零食的价格
- 零食的详情页URL
- 零食的优惠活动
- 零食的店铺
- 零食的图片
2. 目标网页分析
按 F12 召唤出开发者工具,分析 HTML 页面,定位每一项数据在网页中所在的位置,并确定查找的策略。
(1)零食的品牌

可以发现,零食的品牌是在一个
标签下的标签里,每个标签表示一个品牌,而品牌的名字就存放在标签下 标签的 title 属性里。
我们有两种思路获取品牌名,一是通过 class 属性获取到标签,然后循环获取其标签下的 标签的
标签的 id 属性也特别相似,都是 " brand-" 加一串数字,所以可以用正则表达式 'brand-(\w+)' ,根据 id 属性来筛选标签,也可以快速地定位到
标签。(本爬虫中我使用的是后者)(2)零食的 ID
零食的详细信息放在 class 为 gl-item 的标签下,其中
标签有一个叫 data-pid 的属性(3)零食的名字
零食的名字存放在标签下 class 为 p-name 的
标签里的 标签下的 标签里。
(4)零食的价格
零食的价格存放在 class 为 p-price 的
标签中, 标签之下(由于我们之后要对价格做比较,查看价格的涨跌情况,价格需要存储为 float 型的数据,所以这里我们获取 标签下的价格数字)

(5)零食的店铺
零食的店铺存放在 class 为 p-shop 的
标签下, 标签的内容里。

(6)零食的图片
零食的图片 URL 存放在 class 为 p-img 的
标签下, 标签的 src 属性。不过这里的 url 是不完整的,需要对其进行处理,在前面加上 “http://”, 拼接成一个完整的 url 链接。
在这里有一个小的坑,就是实际按这种方法获取的时候,程序会报错,说找不到 标签中的 src 这个属性,将整个标签打印出来后发现, 标签里确实没有 src 属性,反而是有一个 source-data-lazy-img 的属性,它的值也是一个图片的 URL,在浏览器中打开也是可以正确获取到图片的。
查阅资料之后知道,这其实是网页的一种懒加载方式。一般来说,图片的大小都要比纯网页内容大很多,为了保证打开的流畅度,一般都是先加载网页数据,再加载媒体资源,这种方式就是懒加载。所以我们直接通过 source-data-lazy-img 属性获取图片的 URL 即可。
(7)零食详情页的 URL
零食详情页的 URL 存放在 class 为 p-img 的
标签下, 标签的 href 属性值。它跟图片的 URL 一样,有的是不完整的,需要手动添加 “http://” 。

(8)零食的优惠活动
零食的优惠活动的信息存放在 class 为 p-icons 的
标签下, 标签的内容中,但是不同的商品 标签的数量不同,有的甚至没有 标签,所以需要做一个判断。获取
标签下所有的 标签,如果没有

最低0.47元/天 解锁文章
1053

被折叠的 条评论
为什么被折叠?



