作者:韦玮 转载请注明出处
目前,网络爬虫运用领域非常广,在搜索引擎、大数据剖析、客户挖掘中均可以用到。在本篇博文中,天善学院特邀讲师韦玮老师会以当当网爬虫为例,为大家讲解如何编写一个自动爬虫将当当网的商品数据都爬取下来。
配套免费公开课回放地址是,感兴趣的可以直接结合视频学习:

点击不雅观看本次公开课免费配套视频
https://edu.hellobi.com/course/111/overview
首先,须要创建一个名为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='30a2626d8c61fd13 pic']/@title\"大众
#提取商批驳论
\"大众//a[@name='P_pl']/text()\"大众
在这里韶光有限,无法详细讲解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='626d8c61fd131bc6 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万行数据,如下所示:
每个数据占4行,以是将近爬取了19210/4=4802.5条数据,当然这个是估算,由于中间可能会有极少量的数据抓取非常等情形,这是正常的。目前已经抓取了将近100页的数据,而爬虫中设置爬取100页,以是结果属于正常的。
如果中间的细节您没有看懂,那么可以看我们的配套视频哦,配套免费视频中有详细的剖析,如果想系统化学习Python数据剖析及爬虫,想成为Python数据剖析工程师或Python爬虫工程师,可以参加我们的团购课程,目前已经740多人,已经达到最低价了哦,即将截止。
交情提示:
天善智能是海内最大的商业智能BI、数据剖析、大数据领域社区,欢迎大家上岸天善学院有更多免费行业专家数据库,商业智能BI,数据剖析,大数据,数据挖掘视频和干货好文分享。
Friday BI Fly:每周一个主题,一场跟数据有关的行业、工具、技能的互换盛宴。我们的口号是“Friday BI Fly 周五BI飞起来”。 Friday BI Fly 微信直播活动目前已举办30期,往期分享内容包括:【金融行业、零售行业、旅游行业、大数据挖掘、大数据落地、数据剖析师、数据管理、大数据征信、风控管理、Python实战、用户画像、数据管理、数据架构、R措辞等】。
下周分享主题:在实践中挖掘数据的代价第36场,参加每周五的微信直播分享活动,请加微信:fridaybifly(备注:公司+行业+姓名)。
更多内容欢迎上岸:https://www.hellobi.com/ 。