Python 网络爬虫实战:使用 Scrapy + MongoDB 爬取京东网站并部署到云服务器上

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 的

    标签下, 标签的内容中,但是不同的商品  标签的数量不同,有的甚至没有  标签,所以需要做一个判断。获取

    标签下所有的  标签,如果没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值