其他
【爬虫实战】利用scrapy框架爬取豆瓣图书信息
本文作者:陈 鼎 中南财经政法大学统计与数学学院
文字编辑:任 哲
技术总编:张馨月
爬虫俱乐部云端课程
一、前言
二、爬虫流程以及代码实现
(一)分析需要爬取的网页结构
图1.豆瓣的图书标签页
图2.豆瓣每个小标签下的url页面
(二)创建scrapy项目
scrapy startproject douban_books #创建一个名字为douban_books的爬虫项目
cd douban_books #定位到项目文件夹内
scrapy genspider book book.douban.com #创建爬虫所需的脚本文件book.py;book.douban.com设置允许爬取的网页范围(allow_domains)
图3.scrapy项目内容显示
(三)设置USER_AGENT,LOG_LEVEL
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' #设置useragent
LOG_LEVEL = 'WARNING' #设置日志级别,即输出结果只会显示warning以及warning以上的日志
(四)编写爬虫程序
import scrapy
import re
from copy import deepcopy
class BookSpider(scrapy.Spider):
name = 'book'#爬虫名
allowed_domains = ['book.douban.com'] #允许爬取的url地址范围
start_urls = ['https://book.douban.com/tag/?view=type'] #首先发送请求的url地址
def parse(self, response): #实现提取数据等主要逻辑
pass
1. 提取豆瓣图书的大标签,小标签
图4.该6个div标签下存放有标签数据
图5.每个小便签按照每一行进行分组
图6.每个td小标签下有我们所需要的标签数据和详情页地址
def parse(self, response):
item = {}
div_list = response.xpath(".//div[@class='article']/div[2]/div") # 进行分组
for div in div_list:
item["big_title"] = div.xpath("./a/@name").extract_first() # 提取大标签
tr_list = div.xpath(".//table[@class='tagCol']") # 进行分组
for tr in tr_list:
td_list = tr.xpath(".//td")
for td in td_list:
item["small_title"] = td.xpath("./a/text()").extract_first()
item["cate_list_url"] = td.xpath("./a/@href").extract_first()
图7.我们所获取到的大标签、小标签以及对应的url地址
2.发送每个小标签地址的请求,获取每个小标签url地址的响应
if item["cate_list_url"] is not None:
item["cate_list_url"] = 'https://book.douban.com' + item["cate_list_url"]
yield scrapy.Request(
item["cate_list_url"],
callback=self.parse_list,
meta={"item": deepcopy(item)}
)
3. 提取书籍的数据
def parse_list(self, response):
item = response.meta["item"]
li_list = response.xpath(".//ul[@class='subject-list']/li") # 分组
for li in li_list:
item["book_name"] = li.xpath(".//div[@class='info']/h2/a/@title").extract_first()
item["book_name"] = re.sub(r"[(\n)(\t)( )]", "", item["book_name"]) #删除书名中的空格与换行符等
item["book_score"] = li.xpath(".//div[@class='star clearfix']/span[@class='rating_nums']/text()").extract_first()
book_detail_str = li.xpath(".//div[@class='info']//div[@class='pub']/text()").extract_first()
book_detail_str = re.sub(r"[(\n)( )]", "", book_detail_str) #提取书籍简要信息,并对简要信息进行切片处理,提取切片中的内容
book_detail_list = list(book_detail_str.split("/"))
item["book_price"] = book_detail_list[-1] if len(book_detail_list) > 0 else None
item["book_author"] = book_detail_list[0] if len(book_detail_list) > 0 else None
item["book_comment_nums"] = li.xpath(".//div[@class='star clearfix']/span[@class='pl']/text()").extract_first()
item["book_comment_nums"] = re.sub(r"[(\n)( )]", "", item["book_comment_nums"])
print(item)
图8.数据简要预览
4.实现翻页请求
图9.每一页数据爬取完毕需对下一页进行请求
next_page = response.xpath(".//span[@class='next']/a/@href").extract_first()#提取url地址
if next_page is not None:#判断,如果还有下一页,就继续发送请求
next_page = 'https://book.douban.com' + next_page
yield scrapy.Request(
next_page,
callback=self.parse_list,#把发出的请求交给parse_list函数进行处理
meta = {"item":deepcopy(item)}
)
yield item
5. 开启管道,保存数据
import json
class DoubanBooksPipeline:
def process_item(self, item, spider):
with open("douban_book_list.txt","a",encoding="utf-8") as f:
f.write(json.dumps(item,ensure_ascii=False))
6. 运行项目,爬取数据
scrapy crawl book
三、注意事项
《我和我的家乡》影评高频词原来是这些!
用词云图看Sustainability期刊热门题目
震惊!知名数据分析软件竟被某度翻译“亲切称呼”为“斯塔塔”
喜临涛门,月满人圆
字符串函数总动员
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。