打算做一个小小的项目,用于下载论文,所以先学学爬虫的一些相关知识。
创建项目
安装完 scrapy
后,新建一个爬虫的目录,然后在命令行窗口进入该目录,输入以下命令:
scrapy startproject projectname
该目录会包含以下内容:
代码语言:javascript复制projectname/
scrapy.cfg # 部署配置文件
projectname/ # 项目的Python模块,你将从这里导入你的代码
__init__.py
items.py # 项目 items 定义文件
middlewares.py # 项目 middlewares 文件
pipelines.py # 项目 pipelines 文件
settings.py # 项目设置文件
spiders/ # 将在以后放置 spiders 的目录
__init__.py
创建爬虫
上面出现的 spiders
里面包含自己定义的类, Scrapy 将用其来爬去网页的信息。spiders
里面定义的类,必须继承 scrapy.Spider
这个类,以及定义一些初始的请求。比如,如何跟踪页面中的链接,以及如何解析下载的页面内容以提取数据。下面是一个爬虫的示例代码,来自官方文档:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
如上所示,这个子类定义了一些属性和方法:
-
name
:爬虫的名字。在项目中必须是唯一的,也就是说,不能为不同的 Spiders设置相同的名称。 -
start_requests
:必须返回一个可迭代的请求(可以返回请求列表或编写生成器函数),这时 Spider 将开始爬行。后续请求将从这些初始请求中连续生成。 -
parse
:将被调用以处理为每个请求下载的响应的方法。response
参数是TextResponse
的一个实例,它保存页面内容并具有处理内容的其他有用方法。
启动爬虫
要让爬虫工作,请转到项目的顶级目录并在命令行窗口输入以下命令,启动爬虫:
代码语言:javascript复制scrapy crawl quotes ## quotes 是 spider 的 name
将会有下面这样的结果:
在文件目录下也会生成两个 HTML 文件:
解释一下刚刚爬虫的过程:Scrapy 安排了 scrapy.Request
对象,其由 Spider 的 start_requests
方法返回。收到每个响应后,它会实例化 Response
对象并调用与请求相关的回调方法(在本例中为 parse
方法),将响应作为参数传递。
提取数据
推荐在 scrapy shell
中学习提取数据,可以通过以下方式:
scrapy shell "http://quotes.toscrape.com/page/1/"
使用 CSS 来提取数据
如下图所示,是使用 CSS 来提取数据。可以看到结果是一个名为 SelectorList
的类似列表的对象,它表示包含 XML / HTML 元素的 Selector
对象列表,并允许运行更多查询以细化选择或提取数据。
提取标题的文字内容:
使用 extract()
返回的是 list 对象,为了提取具体内容可以用 extract_first()
:
或者也可以使用切片的方式,但是使用切片的话需要注意 IndexError
:
使用 XPath 提取数据
除了 CSS,Scrapy 选择器还支持使用 XPath 表达式:
XPath 表达式提供了更多功能,因为除了导航结构之外,它还可以查看内容。使用 XPath,可以选择包含文本 “下一页” 的链接。这使得 XPath 非常适合抓取任务。
更多内容可以查看:using XPath with Scrapy Selectors