介绍
Scrapy是一个用Python编写的高级Web抓取框架,可以帮助我们快速、简单地从网站抓取数据。
在这个教程中,我们将介绍如何使用Scrapy发送请求获取网页内容。这个过程包括使用Scrapy的一个名为Spider的功能,来定义需要抓取的URL列表,以及如何使用Scrapy发送HTTP请求,来获取网页内容。
定义一个Scrapy Spider
要开始使用Scrapy发送请求获取网页内容,我们必须首先定义一个Scrapy Spider。
每个Scrapy Spider定义了一组要抓取的URL,以及如何解析这些URL所对应的HTML。
在下面的示例中,我们将定义一个Scrapy Spider,该Spider将从一个网站抓取数据。
首先,我们需要创建一个新的Scrapy项目。要创建一个新的Scrapy项目,请打开命令行,转到要保存项目的目录,然后运行下面的命令:
scrapy startproject myproject
接下来,我们需要在项目中创建一个新的Spider。要创建一个新的Spider,请运行以下命令:
cd myproject
scrapy genspider example example.com
这将在myproject/spiders文件夹中创建一个名为example.py的新文件,其中包含一个名为ExampleSpider的Scrapy Spider。
定义要抓取的URL列表
一旦我们有了一个Scrapy Spider,我们就可以开始定义要抓取的URL列表。
要将要抓取的URL添加到Scrapy Spider中,请在Spider的start_requests()方法中添加它们。可以按以下方式完成此操作:
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = ["http://www.example.com"]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
在上面的示例中,我们将http://www.example.com添加到我们要抓取的URL列表中。我们使用start_requests()方法来触发HTTP请求,并指定HTTP响应返回后应调用的回调方法。
在这种情况下,parse()方法是我们要使用的回调方法。在解析所请求的HTML时,我们将在这个方法中执行任何操作。
发送HTTP请求
有了start_requests()方法,我们可以使用Scrapy发送HTTP请求来获取网页内容。可以通过如下方式发送HTTP请求:
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = ["http://www.example.com"]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# Do something with the response, like extracting data.
在上面的示例中,我们使用Scrapy的Request()对象来发送HTTP请求。我们指定要请求的URL以及请求完成后要调用的回调方法。
我们还可以指定其他请求参数,例如User-Agent和Cookie。例如,要在请求中添加User-Agent标头,请使用:
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = ["http://www.example.com"]
def start_requests(self):
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"}
for url in self.start_urls:
yield scrapy.Request(url, headers=headers, callback=self.parse)
在上面的示例中,我们使用headers参数来指定User-Agent标头。这个标头告诉服务器我们使用的是一个Web浏览器,而不是一个自动化工具。
处理HTTP响应
一旦我们发送了HTTP请求并收到了相应的响应,我们需要解析响应并提取所需的数据。
为此,我们可以将解析代码放在parse()方法中,并使用Scrapy提供的一些有用的方法来提取数据。
例如,下面是一个从网页中提取标题文本的示例代码:
def parse(self, response):
title_text = response.xpath('//title/text()').extract_first()
print(title_text)
在这个示例中,我们使用XPath选择器来提取网页中的标题文本。我们使用extract_first()方法来提取第一个匹配项。
使用Scrapy Shell进行网页调试
如果我们希望测试代码或确定响应是否包含我们需要的数据,可以使用Scrapy Shell。
Scrapy Shell是交互式Python解释器,允许我们与网页交互,并尝试使用Scrapy提供的方法来提取数据。
要使用Scrapy Shell,请运行以下命令:
scrapy shell http://www.example.com
在这个示例中,我们将Scrapy Shell用于http://www.example.com。我们可以开始与这个网页交互,并尝试使用Scrapy提供的方法来提取所需的数据。
例如,我们可以使用以下命令来提取网页中的标题:
response.xpath('//title/text()').extract_first()
总结
在这个Scrapy教程中,我们介绍了如何使用Scrapy发送请求获取网页内容。
我们涵盖了以下主题:
- 定义一个Scrapy Spider
- 定义要抓取的URL列表
- 发送HTTP请求
- 处理HTTP响应
我们还介绍了如何使用Scrapy Shell进行网页调试。通过遵循这个教程,我们可以使用Scrapy快速、简单地从网站获取数据。