运用scrapy的知识,爬取豆瓣图书TOP250前2页的书籍(50本)的短评数据(包括书名、评论ID、短评内容),并存储成Excel。
网址链接:https://book.douban.com/top250
(爬虫精进14)
Windows 10 系统,Python 3.7
一、分析网页
多往后翻几页发现规律已经有了:
"https://book.douban.com/top250?start=" + “0” , “25” , "50……"
用 for…in range() 循环可以得到全部网址,我们只取前2页做练习
我们要获取的是每本书的书评相关的数据,在此前要找到所有的书籍链接。
所有书籍的完整链接都存在 div class=“pl2” 元素下,并且没有其他干扰内容,用find_all()提取所有属性为pl2的信息,遍历提取到的url_list, find(‘a’)[‘href’] 则可以帮我们获取到完整的链接。
随便点开一本书的链接,找到所有的短评,点开全部短评,观察一下它的网址,多了个 “comments/” 的后缀,短评第二页又多了个后缀 “hot?p=2” 。往后多翻几页发现p就是控制书评页数的,p=几就会翻到第几页,同样只取2页做个练习就好。
网址都梳理清楚了,现在来观察要爬取的数据都藏在哪里。
书名,书评ID和书评内容都在 div id=“content” 元素中,书名在标签 h1 中
书评ID和书评内容都在 li class=“comment-item” 下,find_all()提取所有信息,遍历列表再取出相应的文本。
思路基本梳理完毕,开始写代码叭~
二、代码实现
1、创建scrapy项目
在本地终端打开你想创建项目的文件夹,输入命令行:
scrapy startproject FB12_01
scrapy目录结构
2、定义items字段
import scrapy
class Fb1201Item(scrapy.Item):
# 书名
booknames = scrapy.Field()
# 书评ID
com_id = scrapy.Field()
# 书评内容
comments = scrapy.Field()
pass
3、爬虫代码
在spiders下创建DouBanbook_comments.py文件,用于编写爬虫代码,如下:
import scrapy,bs4
from ..items import Fb1201Item
# 需要引用Fb1201Item,它在items里面。因为是items在DouBanbook_comments.py的上一级目录,所以要用..items,这是一个固定用法。
class Fb1201Spider(scrapy.Spider):
# 定义一个爬虫类Fb1201Spider
name = 'book_comments'
# 定义爬虫的名字为book_comments
allowde_domains = ['book.douban.com']
# 定义爬虫爬取网址的域名
start_urls = []
# 定义起始网址
for i in range(2):
url = 'https://book.douban.com/top250?start=' + str(i*25)
start_urls.append(url)
# 把豆瓣Top250图书的前2页网址添加进start_urls
def parse(self, response):
# parse是默认处理response的方法
bs = bs4.BeautifulSoup(response.text,'html.parser')
url_list = bs.find_all('div', class_="pl2")
#用find_all提取<div class="pl2">元素,这个元素里含有书籍链接
for ul in url_list:
url = ul.find