scrapy项目3:爬取当当网中机器学习的数据及价格(spider类)

时间:2023-03-09 06:22:37
scrapy项目3:爬取当当网中机器学习的数据及价格(spider类)

1.网页解析

  当当网中,人工智能数据的首页url如下为http://category.dangdang.com/cp01.54.12.00.00.00.html

  scrapy项目3:爬取当当网中机器学习的数据及价格(spider类)

  点击下方的链接,一次观察各个页面的url变化,发现每一页的url规律如下:在进行页面切换时除第一页外,其他页面的url变化规律为只有pg后的数字会随着页面的不同而变化,并且和页面数相同,我们就可以利用此规律,运用spider类来对每一个这样的页面信息进行爬取,并且符合此种规律的页面均可以按照同样的方式来爬取;

  第1页:http://category.dangdang.com/cp01.54.12.00.00.00.html

  第2页:http://category.dangdang.com/pg2-cp01.54.12.00.00.00.html

  第3页:http://category.dangdang.com/pg3-cp01.54.12.00.00.00.html

  第4页:http://category.dangdang.com/pg4-cp01.54.12.00.00.00.html

2. scrapy 具体实现代码

  目标:爬取当当网上人工智能类数据的名称和价格,如下图:

  scrapy项目3:爬取当当网中机器学习的数据及价格(spider类) 

  2.1)项目结构:

  scrapy项目3:爬取当当网中机器学习的数据及价格(spider类)

  2.2)book.py代码

# -*- coding: utf-8 -*-
import scrapy
# 导入items中的类
from dangdang04.items import Dangdang04Item class BookSpider(scrapy.Spider):
name = "book"
allowed_domains = ["category.dangdang.com"]
url = 'http://category.dangdang.com/'
offset = 1
start_urls = [url + 'cp01.54.12.00.00.00.html'] def parse(self, response):
# 实例化类
item = Dangdang04Item()
# 定义提取规则,返回selector对象
book_list = response.xpath('//ul[@class="bigimg"]/li')
for book_info in book_list:
# 书的名称
item['name'] = book_info.xpath('./p[@class="name"]/a/@title').extract()[0]
# 书的价格
item['price'] = book_info.xpath('./p[@class="price"]/span[1]/text()').extract()[0]
yield item if self.offset < 80:
# 构建新的url再次发送请求
self.offset += 1
url = self.url + 'pg' + str(self.offset) + '-cp01.54.12.00.00.00.html'
yield scrapy.Request(url,callback=self.parse)

  2.3)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 Dangdang04Item(scrapy.Item):
# 图书名称
name = scrapy.Field()
# 价格
price = scrapy.Field()

  2.4)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 import json class Dangdang04Pipeline(object):
def __init__(self):
# 定义json文件,用于写入爬取的目标信息
self.filename = open('booklist.json','w')
def process_item(self, item, spider):
# 将item数据转换乘json格式数据
text = json.dumps(dict(item),ensure_ascii = False) + '\n'
# 将text数据写入本地文件中
self.filename.write(text.encode('utf-8'))
return item def close_spider(self,spider):
# 爬虫结束,关闭本地文件
self.filename.close()

  2.5).settings.py文件对应设置

# user-agent设置
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'
# 下载延迟设置
DOWNLOAD_DELAY = 2.5
# 关键文件配置
ITEM_PIPELINES = {
'dangdang04.pipelines.Dangdang04Pipeline': 300,
}