第四次大作业
第四次作业
-
-
要求:熟练掌握
scrapy
中Item
、Pipeline
数据的序列化输出方法,使用Scrapy
+Xpath
+MySQL
数据库存储技术路线爬取当当网站图书数据 -
关键词:学生自由选择
-
输出信息:
id | title | author | publisher | date | price | detail |
---|---|---|---|---|---|---|
1 | Python算法图解 | 何韬 | 清华大学出版社 | 2021-04-01 | ¥34.50 | 用到算法。数据结构是算法的基础,数组、字典、堆、栈、链表... |
.. | .. | .. | .. | .. | .. | .. |
思路
直接复现教参代码,学习大神的代码风格,这里就不reinvent wheels
核心代码
# spider 文件
class BookSpider(scrapy.Spider):
name = 'book'
allowed_domains = ['dangdang.com']
key = 'python'
source_url = 'http://search.dangdang.com/'
# 用page 来控制显示当前页数
page = 1
# count用来控制爬取的数据项数目
count = 1
def start_requests(self):
# key为搜索的词项,要爬取python,就将key设定为python,这样网页就变成了搜索python的结果
url = self.source_url + "?key=" + self.key
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
dammit = UnicodeDammit(response.body, ["utf-8", "gbk"])
data = dammit.unicode_markup
selector = scrapy.Selector(text=data)
lis = selector.xpath("//li['@ddt-pit'][starts-with(@class,'line')]")
for li in lis:
# 图书名,列表
title = li.xpath("./a[position()=1]/@title").extract_first()
# 价格,列表
price = li.xpath("./p[@class='price']/span[@class='search_now_price']/text()").extract_first() # 作者,列表
author = li.xpath("./p[@class='search_book_author']/span[position()=1]/a/@title").extract_first() # 日期,列表
date = li.xpath("./p[@class='search_book_author']/span[position()=last()- 1]/text()").extract_first()
# 出版社,列表
publisher = li.xpath("./p[@class='search_book_author']/span[position()=last()]/a/@title ").extract_first()
# 介绍,列表
detail = li.xpath("./p[@class='detail']/text()").extract_first()
item = DdItem()
item["title"] = title.strip() if title else ""
item["author"] = author.strip() if author else ""
item["date"] = date.strip()[1:] if date else ""
item["publisher"] = publisher.strip() if publisher else ""
item["price"] = price.strip() if price else ""
item["detail"] = detail.strip() if detail else ""
# 用来控制爬取 108项
if self.count <=107:
self.count += 1
yield item
else:
print('结束爬取,共爬取108项')
break
link = selector.xpath("//div[@class='paging']/ul[@name='Fy']/li[@class='next']/a/@href").extract_first()
#page<=3意味着要爬取4页
if self.page <= 3:
if link:
#页数加一再翻页