D 1. 实战 - scrapy爬虫抓取当当图书

1 抓取当当图书详情,存入mysql


1.1 项目需求

  1. 抓取当当网上当当自营的湖南教育出版社书籍信息,通过异步的方式存入mysql数据库。
  2. 训练目的:html,js页面抓取,异步存储
  3. url 地址:
    http://search.dangdang.com/?key=%BA%FE%C4%CF%BD%CC%D3%FD%B3%F6%B0%E6%C9%E7&ddsale=1
  4. 图书信息包括:
    • 名字 name
    • 价格 price
    • 作者 author
    • 出版日期 time
    • 出版社 publisher
    • 评分 star
    • 评论数 comment_num
    • ISBN
    • 类型 book_type

1.2 页面分析

  1. 图书列表页面分析
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()
  1. 图书详情页分析
# 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']

猜你喜欢

转载自blog.csdn.net/qq_41682050/article/details/81154855
今日推荐