scrapy分页抓取网页(Python网络爬虫与信息提取(北京理工大学慕课)生成的这些东西)
优采云 发布时间: 2022-01-03 14:02scrapy分页抓取网页(Python网络爬虫与信息提取(北京理工大学慕课)生成的这些东西)
参考资料:Python网络爬虫与信息抽取(北京理工大学MOOC)
这是我们要抓取的页面:
要使用Scrapy库,首先需要生成一个Scrapy爬虫框架,分为以下几个步骤: 1.建立一个Scrapy爬虫项目
首先,我们打开 Pycharm 并创建一个新项目。在这里我创建了一个名为 demo 的新项目:
然后我们打开Pycharm的终端,输入scrapy startproject python123demo:
这样,我们就建立了一个Scrapy爬虫项目:
那么这些东西是怎么产生的?
部署的概念是指:将构建好的爬虫放在特定的服务器上,在服务器上配置相关的操作接口。
对于本机使用的爬虫,我们不需要更改部署的配置文件
如果用户想要扩展中间件的功能,需要将这些功能写入第二个python123demo/文件中。
如果要优化爬虫功能,需要在settings.py文件中修改相应的配置项。
python123demo项目中创建的spider存放在spiders/目录下:
2.在项目中生成一个Scrapy爬虫
在项目中,只需要执行一个命令就可以生成一个爬虫,但是这个命令需要与用户给出的爬虫名称和被爬取的网站达成一致。
我们打开Pycharm,在终端输入scrapy genspider demo python123.io:
该命令的作用是生成一个名为demo(即爬虫)的蜘蛛,然后我们会发现在spiders目录下添加了一个名为demo.py的代码:
这里我们使用了一个命令来生成文件,看起来很神秘,但是这个命令的作用仅限于生成demo.py。
如果不使用这个命令生成demo.py,其实我们也可以手动生成这个文件。
打开demo.py:
我们看到它是一个以面向对象的方式编写的类。这个类叫做DemoSpider。
由于爬虫的名字是demo,所以类名也是DemoSpider。
名字是什么无关紧要,但是这个类必须是继承自scrapy.Spider的子类。
name = "demo" 表示当前爬虫的名字是demo。
allowed_domains 是用户在开头向命令行提交的域名,表示这个爬虫爬取网站时,只能爬取这个域名下面的相关链接。 (这是一个可选参数)
start_urls 是一个非常重要的变量。顾名思义,实际上以列表形式收录的一个或多个URL就是scrapy框架要抓取的页面的初始页面。
def parse()是一个解析页面的空方法,收录在这个类中,用于处理响应,解析内容形成字典,发现新的URL爬取请求。
3.配置生成的蜘蛛爬虫
具体来说,我们需要修改demo.py文件,使其可以根据我们的需求访问我们想要访问的链接,并抓取相关链接内容。
这里定义了链接解析部分的功能:将返回的html页面保存为文件。
具体我们修改demo.py文件如下:
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
# allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response): # resonse相当于从网络中返回内容所存储的或对应的对象
fname = response.url.split('/')[-1] # 定义文件名字,把response中的内容写到一个html文件中
with open (fname, 'wb') as f: # 从响应的url中提取文件名字作为保存为本地的文件名,然后将返回的内容保存为文件
f.write(response.body)
self.log('Saved file %s.' % fname) # self.log是运行日志,不是必要的
# 这样,我们的demo.py文件就能够爬取一个网页,并且能够将网页的内容保存为一个html文件
4.运行爬虫获取网页
在pycharm终端输入scrapy crawl demo
然后就可以爬到这个页面了:
这里我们回顾一下 demo.py 代码:
start_urls 变量表示爬虫启动时的第一个 URL 链接。
parse 方法表示解析返回页面和执行操作的相关步骤。
事实上这行代码是scrapy框架提供的一个简化版代码。
对应完整版:
你可以看到有一个额外的 start_requests 方法。
那么这两个版本有什么区别?
该命令生成的 demo.py 文件的简化版本,它使用 start_urls 列表给出初始 URL 链接。
srapy 框架支持的另一种等效方法是使用称为 start_requests 的方法。在这个方法中,首先定义了一个url列表,列表中的每个列表通过yield scrapy发送给Engine。Requests 做了一个url访问请求。