scrapy爬取当当网所有3c产品商品名称,价格,评论数

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。

Scrapy

首先祭上scrapy的工作流程图。

scrapy

我们暂时不去管scrapy的设计,先看看怎么用先。

在命令终端输入

1
2
3
scrapy startproject dangdang
cd dangdang
scrapy genspider dangdangwang dangdang.com

解释一下上面的命令的含义,startporject是新建一个工程,cd就是到新建的工程项目文件夹下,genspider是依照模板生成一个爬虫,默认状态是basic模板。

在工程文件夹下的终端输入tree就可以得到如下的文件,如果输入tree显示找不到该命令的话,先安装一个小软件,apt-get install tree ,附上tree的手册tree(1) - Linux man page

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
tree
.
├── 201708260.txt
├── dangdang
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── items.py
│ ├── items.pyc
│ ├── middlewares.py
│ ├── pipelines2excel.py
│ ├── pipelines.py
│ ├── pipelines.pyc
│ ├── settings.py
│ ├── settings.pyc
│ └── spiders
│ ├── dangdangwang.py
│ ├── dangdangwang.pyc
│ ├── __init__.py
│ └── __init__.pyc
└── scrapy.cfg

文件布局如上面树所示

开始工作

修改item.py文件

item.py是定义scrapy抓取信息的地方,相当与你在这里要为你想得到的每一种信息都要取一个名字,名字当然是见字知意最好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- 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()
# 价格
price=scrapy.Field()
# 页面链接
link=scrapy.Field()

修改dangdangwang.py文件

dangdangwang.py文件位于spiders文件夹下,是爬虫的主要行为,他定义了如何去定位信息,把什么信息赋值给哪个item。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- coding: utf-8 -*-
import scrapy
from dangdang.items import DangdangItem
class DangdangwangSpider(scrapy.Spider):
name = "dangdangwang"
allowed_domains = ["dangdang.com"]
start_urls = ['http://category.dangdang.com/pg1-cid4002590.html']
def parse(self, response):
# 每一个商品的点击链接(详情链接)
url_list=response.xpath('.//*[@id="component_0__0__8609"]/li/p[@class="name"]/a/@href').extract()
for url in url_list:
yield scrapy.http.Request(url,callback=self.parse_name)
# 搜索分类的分页
for i in range(2,98):
page_url='http://category.dangdang.com/pg{}-cid4002590.html'.format(i)
yield scrapy.http.Request(page_url,callback=self.parse)
def parse_name(self,response):
items=DangdangItem()
items['title']=response.xpath('//div[@class="name_info"]/h1/text()').extract()
items['num']=response.xpath('//div[@class="pinglun"]/a/text()').extract()
items['price']=response.xpath('//div[@class="price_d"]/p[@id="dd-price"]/text()').extract()
items['link']=response.url
yield items

修改pipelines.py

pipelines.py文件是定义了爬取的数据如何保存的文件,就像他的名字一样,数据的管道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- 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
import time
import os.path
class DangdangPipeline(object):
def process_item(self, item, spider):
# print u"商品名字:"+item['title'][0]
# print u"商品价格:"+item['price'][0]
# print u"商品评论数"+item['num'][0]
# return item
today = time.strftime('%Y%m%d', time.localtime())
fileName = today + '.txt'
with open(fileName,'a') as fp:
fp.write(item['title'][0].replace(' ','').encode('utf8') + '\t')
fp.write("价格"+item['price'][0].encode('utf8') + '\t')
fp.write("评论数"+item['num'][0].encode('utf8') + '\t')
fp.write('\n')
# time.sleep(1)
return item

这里定义的是将数据保存到一个txt记事本。效果如图所示

gjLDA.md.png

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------