学习笔记
使用Scrapy框架爬取豆瓣图书信息
首先了解Scrapy框架
Scrapy框架是一套基于Twisted的异步处理框架,是使用python实现的爬虫框架,在使用时只需要更改几个模块就可以实现一个爬虫项目,用来抓取网页内容。
网络上可以搜到很多关于Scrapy框架的介绍,可以参考链接 link 入门教程,有比较通俗的运行流程解释
安装Scrapy框架
通过 pip 安装 Scrapy 框架:
pip install Scrapy
添加镜像源会快一点
pip install Scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
我这里爬取的内容是豆瓣读书界面的书籍信息
网站链接是:链接 link
因为链接里带有:“名著” 两个中文,所以写成这样
https://book.douban.com/tag/%E5%90%8D%E8%91%97
1.新建项目(scrapy startproject)
在开始爬取之前,必须创建一个新的Scrapy项目。
scrapy startproject douban # douban 为项目名称
进入自定义的项目目录中,在终端运行下列命令: cd douban
2.生成爬虫(scrapy genspider)
创建一个名为doubanspider的爬虫,并指定爬取域的范围,这里是豆瓣的主网站
scrapy genspider doubanspider "https://book.douban.com"
结构是这样,douban.txt 是我运行完之后生成的,一开始没有
- scrapy.cfg: 项目的配置文件。
- items.py: 项目的目标文件。这里写要爬取的内容比如标题title、作者author等等
- pipelines.py: 项目的管道文件。这里负责数据处理,存储数据或者连接数据库
- settings.py: 项目的设置文件。配置一些重要东西
- spiders/: 存储爬虫代码目录。doubanspider是主要写爬虫代码的
在爬虫之前先对网页进行测试,在开发者工具 Network中看是get方法还是post方法。
这里是get
对豆瓣读书网站进行测试 参考链接 link
import requests
response = requests.get('https://book.douban.com/tag/%E5%90%8D%E8%91%97')
print(response)
输出: <Response [418]> 表示网站拒绝
解决方法:在 Network - Request Headers 里找到 User-Agent:
import requests
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get('https://book.douban.com/tag/%E5%90%8D%E8%91%97', headers = header)
print(response)
# <Response [200]> 表示能够获取内容
能够请求到之后,将 User-Agent 加入到项目的 sittings.py 文件中
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
3.开始写代码
将start_urls的值修改为需要爬取的第一个url
查看要爬取内容的位置,使用xpath定位
网上xpath的教程很多 参考链接 link
(1)doubanspider.py 完整的代码
爬取了标题title、网址url、书籍作者及信息author、内容介绍content(在parse_detail函数中)
import scrapy
from ..items import DoubanItem
class DoubanspiderSpider(scrapy.Spider):
name = "doubanspider" # 爬虫名
allowed_domains = ["book.douban.com"] # 搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页
start_urls = ["https://book.douban.com/tag/%E5%90%8D%E8%91%97"] # 爬虫从这里开始抓取数据
def parse(self, response):
for dom in response.xpath('//ul[@class="subject-list"]/li[@class="subject-item"]/div[@class="info"]'):
title = dom.xpath('.//h2/a/text()').get() # 在网站中找到相应标题的位置
url = dom.xpath('.//h2/a/@href').get()
author = dom.xpath('.//div[@class="pub"]/text()').get()
# introduce = dom.xpath('.//p/text()').getall()
item = DoubanItem()
item['title'] = title
item['url'] = url
item['author'] = author
# item['introduce'] = introduce
yield scrapy.Request(url, meta={'item': item}, callback=self.parse_detail)
next_page = response.xpath('//div[@class="paginator"]/span[@class="next"]/a/@href').get() # 下一页按钮
if next_page is not None: # 判断是否到最后一页
next_page = "https://book.douban.com" + next_page
yield scrapy.Request(next_page, callback=self.parse)
def parse_detail(self, response):
content = response.xpath('//div[@id="wrapper"]/div[@id="content"]/div[@class="grid-16-8 clearfix"]/div[@class="article"]/div[@class="related_info"]/div[@class="indent"]/span[@class="short"]/div[@class="intro"]/p/text()').get()
item = response.meta['item']
item['content'] = content
yield item
url是这本书标题点进去的地址,再爬取详情页的内容介绍
(2)items.py代码 —添加爬取的内容
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
url = scrapy.Field()
author = scrapy.Field()
# introduce = scrapy.Field()
content = scrapy.Field()
(3)保存爬取的数据
settings.py 中设置激活Item Pipeline组件,数值表示优先级,数值越低优先级越高,习惯上在0-1000范围内定义数字。默认的300
ITEM_PIPELINES = { "douban.pipelines.DoubanPipeline": 300,}
pipelines.py 代码 保存在 douban.txt 文件中
from itemadapter import ItemAdapter
import json
class DoubanPipeline:
def __init__(self):
self.file = open('douban.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
content = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(content)
return item
在终端的douban目录中执行
scrapy crawl doubanspider
正常就能爬到数据了
以上就是一份简单的爬虫代码,希望对你有所帮助。