1 抓取当当图书详情,存入mysql
1.1 项目需求
- 抓取当当网上当当自营的湖南教育出版社书籍信息,通过异步的方式存入mysql数据库。
- 训练目的:html,js页面抓取,异步存储
- url 地址:
http://search.dangdang.com/?key=%BA%FE%C4%CF%BD%CC%D3%FD%B3%F6%B0%E6%C9%E7&ddsale=1 - 图书信息包括:
- 名字 name
- 价格 price
- 作者 author
- 出版日期 time
- 出版社 publisher
- 评分 star
- 评论数 comment_num
- ISBN
- 类型 book_type
1.2 页面分析
- 图书列表页面分析
scrapy shell
fetch('http://search.dangdang.com/?key=%BA%FE%C4%CF%BD%CC%D3%FD%B3%F6%B0%E6%C9%E7&ddsale=1')
sel = response.css('ul.bigimg li')
# 书名
name = sel[0].css('p.name a::attr(title)').extract_first()
# 价格
price = sel[0].css('p.price span::text').extract_first()
# 作者
author = sel[0].css('p.search_book_author span')[0].css('a::text').extract()
# 出版日期
time = sel[0].css('p.search_book_author span')[1].css('span::text').extract_first().split('/')[1]
# 出版社
publisher = sel[0].css('p.search_book_author a::text').extract()[-1]
# 评分
star = sel[0].css('span.search_star_black span::attr(style)').extract_first().split(' ')[1]
# 评论数
comment_num = sel[0].css('a.search_comment_num::text').extract_first().split('条')[0]
# 跳转url
url = sel[0].css('p.name a::attr(href)').extract_first()
- 图书详情页分析
# ID
book['ID'] = re.findall(r'com/(.*).html',response.url)[0]
li = response.xpath('//ul[@class="key clearfix"]/li/text()').extract()
# ISBN
book['ISBN'] = li[4].split(':')[1]
# 类型
book['book_type'] = response.xpath('//span[@class="lie"]/a/text()').extract()
1.3 编程
1、创建项目、爬虫
2、修改Items.py
import scrapy
class DangdangBook722Item(scrapy.Item):
name = scrapy.Field()
......
ISBN = scrapy.Field()
book_type = scrapy.Field(serializer=lambda x: '|'.join(x))
3、修改spider
略
4、修改pipeline
# 存入数据库
1.4 遇到问题
1.4.1 编写spider
- 问题一:
图书信息需要提取两个页面才能完成,那么如何把上一个def中的数据,传入下一个def中呢?
# 构造字典 meta={'_book_item':book_item},通过scrapy.Request传入
# 下一个def 通过book_item = response.meta['_book_item']获得数据
def parse(self, response):
......
yield scrapy.Request(url, headers= {'User-Agent':'Mozilla/5.0'}, callback=self.book_parse, meta={'_book_item':book_item})
def parse_book(self, response):
book_item = response.meta['_book_item']