Python实战案例分享:爬取当当网商品数据

简介: 目前,网络爬虫应用领域非常广,在搜索引擎、大数据分析、客户挖掘中均可以……

​​作者:韦玮

转载请注明出处

 目前,网络爬虫应用领域非常广,在搜索引擎、大数据分析、客户挖掘中均可以用到。在本篇博文中,韦玮老师会以当当网爬虫为例,为大家讲解如何编写一个自动爬虫将当当网的商品数据都爬取下来。

首先,需要创建一个名为dangdang的爬虫项目,如下所示:


D:\Python35\myweb>scrapy startproject dangdang

New Scrapy project 'dangdang', using template directory 'd:\\python35\\lib\\site-packages\\scrapy\\templates\\project', created in:

    D:\Python35\myweb\dangdang

You can start your first spider with:

    cd dangdang

    scrapy genspider example example.com


创建好了爬虫项目之后,我们需要进入该爬虫项目,然后在爬虫项目中创建一个爬虫,如下所示:


D:\Python35\myweb>cd .\dangdang\

D:\Python35\myweb\dangdang>scrapy genspider -t basic dangspd dangdang.com

Created spider 'dangspd' using template 'basic' in module:

  Dangdang.spiders.dangspd


爬虫和爬虫项目是不一样的,一个爬虫项目中可以有1个或多个爬虫文件。

随后,我们需要编写items.py文件,在该文件中定义好需要爬取的内容,我们将items.py文件修改为如下所示:


# -*- coding: utf-8 -*-

# Define here the models for your scraped items

#

# See documentation in:

http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class DangdangItem(scrapy.Item):

    # define the fields for your item here like:

    # name = scrapy.Field()

    #商品标题

    title=scrapy.Field()

    #商品评论数

    num=scrapy.Field()


随后,需要编写pipelines.py文件,在pipelines.py文件中,我们一般会编写一些爬取后数据处理的代码,我们需要将爬取到的信息依次展现到屏幕上(当然你也可以将爬取到的信息写进文件或数据库中),我们将pipelines.py文件修改为如下所示:


# -*- coding: utf-8 -*-

# Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

class DangdangPipeline(object):

    def process_item(self, item, spider):

        #item=dict(item)

        #print(len(item["name"]))

        for j in range(0,len(item["title"])):

            print(j)

            title=item["title"][j]

            num=item["num"][j]

            print("商品名:"+title)

            print("商品评论数:"+num)

            print("--------")

        return item


随后,接下来我们还需要编写配置文件settings.py,编写配置文件的目的有两个:

1)、启用刚刚编写的pipelines,因为默认是不启用的。

2)、设置不遵循robots协议爬行,因为该协议对我们的爬虫有相关限制,遵循该协议,可能会无法爬取到结果。

我们可以将配置文件settings.py的robots协议配置部分修改为如下所示,此时值设置为False,代表让爬虫不遵循当当网的robots协议爬行,当然我们不要利用这些技术做违法事项。


# Obey robots.txt rules

ROBOTSTXT_OBEY = False

然后,我们再将配置文件settings.py的pipelines配置部分设置为如下所示,开启对应的pipelines:

# Configure item pipelines

# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html

ITEM_PIPELINES = {

    'dangdang.pipelines.DangdangPipeline': 300,

}


随后,我们需要分析当当网的网页结构,总结出信息提取的规则以及自动爬行的规律。

我们打开某一个频道页,各页对应的网址如下所示:

http://category.dangdang.com/pg1-cid4002644.html

http://category.dangdang.com/pg2-cid4002644.html

http://category.dangdang.com/pg3-cid4002644.html

……

此时,我们会发现,网页的格式形如:http://category.dangdang.com/pg[页码]-cid4002644.html

有了该规律之后,我们可以将页码位置设置为变量,通过for循环就可以构造出一个频道中所有的商品页,也就通过这种方式实现了自动爬取。

然后,我们再分析商品信息的提取规律。

我们打开任意一个频道页http://category.dangdang.com/pg1-cid4002644.html,然后可以看到如下界面:


此时我们需要提取该页面中所有的商品标题和商品评论信息,将其他无关信息过滤掉。所以,我们可以查看该网页源代码,以第一个商品为例进行分析,然后总结出所有商品的提取规律。我们可以右键--查看源代码,然后通过ctrl+find快速定位源码中该商品的对应源代码部分,如下所示:


对应源代码复制出来如下所示:


……

<a title=" [当当自营]EGISOO御姬秀橙花润唇膏3g 无色护唇膏 淡化唇纹 水润晶莹 保湿润唇膏 "   class="pic"  href="https://ask.hellobi.com/http://product.dangdang.com/60629118.html#ddclick?act=click&pos=60629118_0_2_m&cat=4002644&key=&qinfo=&pinfo=&minfo=14215_1_48&ninfo=&custid=&permid=20160906025129757347420307757891648&ref=&rcount=&type=&t=1476452492000&searchapi_version=test_ori"  target="_blank" ><img src='http://img3x8.ddimg.cn/33/30/60629118-1_b_2.jpg' alt=' [当当自营]EGISOO御姬秀橙花润唇膏3g 无色护唇膏 淡化唇纹 水润晶莹 保湿润唇膏 ' /></a><p class="price" > <span class="price_n">¥9.90</span></p><p class="name" ><a title=" [当当自营]EGISOO御姬秀橙花润唇膏3g 无色护唇膏 淡化唇纹 水润晶莹 保湿润唇膏 " href="https://ask.hellobi.com/http://product.dangdang.com/60629118.html#ddclick?act=click&pos=60629118_0_2_m&cat=4002644&key=&qinfo=&pinfo=&minfo=14215_1_48&ninfo=&custid=&permid=20160906025129757347420307757891648&ref=&rcount=&type=&t=1476452492000&searchapi_version=test_ori" target="_blank" > [当当自营]EGISOO御姬秀橙花润唇膏3g 无色护唇膏 淡化唇纹 水润晶莹 保湿润唇膏 </a></p><p class="subtitle" > 明星都在用 水润护唇 秋冬换季必备 呵护你的双唇晶莹剔透明媚动人  正品保证 货到付款 </p><p class="star"  style="display:none"><span class="level"><span style="width: 100%;"></span></span><a href="https://ask.hellobi.com/http://comm.dangdang.com/review/reviewlist.php?pid=60629118#ddclick?act=sort_total_review_count_desc&pos=60629118_0_2_m&cat=4002644&key=&qinfo=&pinfo=&minfo=14215_1_48&ninfo=&custid=&permid=20160906025129757347420307757891648&ref=&rcount=&type=&t=1476452492000&searchapi_version=test_ori" target="_blank" name="P_pl">434条评论</a></p>                </div>

……


所以,我们可以得到提取商品标题和商品评论的Xpath表达式,如下所示:


#提取商品标题

"//a[@class='pic']/@title"

#提取商品评论

"//a[@name='P_pl']/text()"


在这里时间有限,无法详细讲解Xpath表达式基础,没有Xpath表达式基础的朋友可以参考下方作者的书籍或者百度自行补充,XPath基础部分知识不属于本篇博文范畴。

此时,我们已经总结出了信息提取的对应的Xpath表达式,然后我们可以编写刚才最开始的时候创建的爬虫文件dangspd.py了,我们将爬虫文件编写修改为如下所示:


# -*- coding: utf-8 -*-

import scrapy

import re

from dangdang.items import DangdangItem

from scrapy.http import Request

class DangspdSpider(scrapy.Spider):

    name = "dangspd"

    allowed_domains = ["dangdang.com"]

    start_urls = (

        'http://category.dangdang.com/pg1-cid4002644.html',

    )

    def parse(self, response):

        item=DangdangItem()

        item["title"]=response.xpath("//a[@class='pic']/@title").extract()

        item["num"]=response.xpath("//a[@name='P_pl']/text()").extract()

        yield item

        for i in range(2,101):

            url="http://category.dangdang.com/pg"+str(i)+"-cid4002644.html"

            yield Request(url, callback=self.parse) 


这样,就可以实现爬虫的编写了。

随后,我们可以进入调试和运行阶段。

我们进入cmd界面,运行该爬虫,出现如下所示结果,中间结果太长,省略了部分:


D:\Python35\myweb\dangdang>scrapy crawl dangspd --nolog

……

43

商品名: WIS水润面膜套装24片 祛痘控油补水保湿淡痘印收缩毛孔面膜贴男女

商品评论数:255条评论

--------

44

商品名:欧诗漫水活奇迹系列【水活奇迹珍珠水(清润型)+珍珠水活奇迹保湿凝乳】

商品评论数:0条评论

--------

45

商品名:【法国进口】雅漾(Avene)活泉恒润保湿精华乳30ml 0064

商品评论数:0条评论

--------

46

商品名:【法国进口】Avene雅漾敏感肌肤护理净柔洁面摩丝150ml温和泡沫洁面乳洗面奶0655

商品评论数:0条评论

--------

47

商品名:珍视明中老年护眼贴2盒装 30对60贴  针对中老年用眼问题 缓解眼疲劳

商品评论数:226条评论

--------


可以看到,此时一共输出了19K多行,将近2万行数据,如下所示:

捕获3.PNG捕获3.PNG

每个数据占4行,所以将近爬取了19210/4=4802.5条数据,当然这个是估算,因为中间可能会有极少量的数据抓取异常等情况,这是正常的。目前已经抓取了将近100页的数据,而爬虫中设置爬取100页,所以结果属于正常的。


作者新书推荐

58d0cd32Nddf92407.jpg


目录
相关文章
|
6天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
41 6
|
6天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
79 44
|
1天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
2天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
8 1
|
2天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
9 1
|
5天前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
本文介绍了 Python 在跨平台开发中的强大能力,通过实际例子展示了如何使用 `os` 和 `pathlib` 模块处理文件系统操作,`subprocess` 模块执行外部命令,以及 `tkinter` 创建跨平台的图形用户界面。这些工具和模块帮助开发者轻松应对不同操作系统间的差异,专注于业务逻辑。
18 2
|
3天前
|
开发者 Python
探索Python中的装饰器:从入门到实战
【10月更文挑战第30天】本文将深入浅出地介绍Python中一个强大而有趣的特性——装饰器。我们将通过实际代码示例,一步步揭示装饰器如何简化代码、增强函数功能并保持代码的可读性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往更高效编程的大门。
|
监控 数据库 双11
用 Python 制作商品历史价格查询
一年一度的双十一就快到了,各种砍价、盖楼、挖现金的口令将在未来一个月内充斥朋友圈、微信群中。玩过多次双十一活动的小编表示一顿操作猛如虎,一看结果2毛5。浪费时间不说而且未必得到真正的优惠,双十一电商的“明降暗升”已经是默认的潜规则了。打破这种规则很简单,可以用 Python 写一个定时监控商品价格的小工具。
512 0
用 Python 制作商品历史价格查询
|
9天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###