创建项目
使用scrapy startproject Spider
创建一个名为Spider
的项目。
使用vscode打开项目,可以看见该项目的文件结构:
再一次介绍各文件的作用:
- scrapy.cfg:项目部署文件
- spiders:存放爬虫文件的文件夹
- items.py:保存爬取到的数据的容器
- middlewares.py:中间件
- pipelines.py:将爬取的数据进行持久化存储
- setting.py:配置文件
爬虫文件
在spiders目录下创建一个新的py文件,文件名为爬虫名,爬虫名必须是唯一的。
首先写一个爬取静态网页的爬虫。那么什么是静态网页,什么又是动态网页的?
- 静态网页,随着HTML代码的生成,页面的内容和显示效果就基本不会发生变化的网页,除非修改网页代码。
- 动态网页,虽然网页代码没有变,但是显示内容是随着时间、环境或者数据库操作的结果而发生改变的网页。
豆瓣的新书速递(url = 'https://book.douban.com/latest?icn=index-latestbook-all'
)就是一个静态网页。
在浏览器中打开开发者调试工具,进入NetWork,刷新网页,找到第一个也就是与目标url相同的请求。
可以看到打开该网页时发生的网络请求与响应。选择预览,可以看到网页的预渲染。
可以看到我们需要的数据已经在网页上了,这就说明是静态网页。
创建一个名为douban_book的py文件。
import scrapy
class tvSpider(scrapy.Spider):
# name是爬虫名称,它必须是唯一的
name = "douban_book"
allowed_domain = ["book.douban.com"]
# 初始化url
def __init__(self, *args, **kwargs):
super(DoubanBookSpider, self).__init__(*args, **kwargs)
self.start_urls = ["https://book.douban.com/latest?icn=index-latsetbook-all"]
# 解析函数
def parse(self, response):
pass
确定了要爬取的目标网页,接下来就是要获取的自己想要的数据,这就要写解析函数parse
。
parse
负责处理响应并必须返回一个可迭代的Request和dists或Item对象。
选择器
Scrapy自己内置一套数据提取机制,成为选择器。它们通过特定的XPath或者CSS表达式来选择HTML文件中的某个部分,Scrapy选择器构建于lxml库上。
Selector对象有四个基本方法:
- xpath(query):传入XPath表达式query,返回该表达式所对应的所有节点的selector list列表。
- css(query):传入CSS表达式query,返回该表达式所对应的所有节点的selector list列表。
- extract():序列化该节点为Unicode字符串并返回list列表。
- re(regex):根据传入的正则表达式对数据进行提取,返回Unicode字符串列表。
这里使用XPath来提取数据。
我们发现数据存储在li标签中。所以我们的思路就是先使用XPath表达式获取到所有的li标签,生成一个list,然后遍历这个list获取到每一项数据。
我们可以直接右键li标签copy到XPath表达式,但偶尔会出问题,所以我们自己写。
我们可以在代码区域按ctrl + f
,然后输入自己XPath表达式验证是否正确。
可以看到我们写的//ul[@class="cover-col-4 clearfix"]
表达式,一共获取到了20条li标签,然后我们就要通过迭代的方式来提取出每一条li标签里的数据。
Parse
我们要获取的数据有:图片、链接、书名、作者、发布时间、书籍介绍、页数、价格。
其中页数和价格需要进入详情网页进行二次解析,其他数据则可以在该页直接获取到。
我们将整个逻辑写入到parse函数中:
def parse(self, response):
result = Selector(response)
book_list = result.xpath('//*[@class="cover-col-4 clearfix"]/li')
for book_ele in book_list:
# 图片
cover_url = book_ele.xpath('./a[@class="cover"]/img/@src').extract()[0