scrapy分页抓取网页(Python中一个非常棒的网页抓取网页中常见的问题)
优采云 发布时间: 2021-10-11 16:06scrapy分页抓取网页(Python中一个非常棒的网页抓取网页中常见的问题)
Python部落()整理翻译,禁止转载,欢迎转发。
在上一篇使用 Python 抓取网页的博文中,我们谈到了 Scrapy。在本节中,让我们深入探讨它。
Scrapy 是一个很棒的 Python 网页抓取框架。它可以处理*敏*感*词*网络爬行过程中的一些常见问题。
Scrapy 与 Requests 或 BeautifulSoup 等其他常用库的区别非常明显。它可以通过简单的方式解决网络爬虫中的常见问题。
Scrapy 的缺点是学习曲线非常陡峭,需要学习的东西很多,但这就是我们要在这里讨论的内容。
在本教程中,我们将创建两个不同的网络爬虫。一种是从电商产品页面提取数据比较简单,另一种是抓取整个电商目录比较复杂。
基本概述
您可以使用 pip 安装 Scrapy。但也要注意,Scrapy 的文档强烈建议将其安装在虚拟环境中,以避免与您的系统软件包发生冲突。
我在这里使用 Virtualenv 和 Virtualenvwrapper:
然后
现在您可以使用以下命令创建一个新的 Scrapy 项目:
上面的命令将为这个项目创建所有必要的模板文件。
下面简单介绍一下上述文件和目录:
在此示例中,我们将从虚拟电子商务 网站 中抓取单个产品。这是我们要抓取的第一个产品:
我们要解析这个产品的名称、图片、价格和描述。
破壳
Scrapy 提供了内置的 Shell 控制台,方便你实时运行和调试爬虫脚本。您可以使用它来快速测试 XPath 表达式或 CSS 选择器。我一直在使用这个很酷的网络爬虫。
您还可以配置 Scrapy Shell 以使用其他控制台来替换默认的 Python 控制台,例如 IPython。可实现自动补全功能或其他特殊效果,如颜色输出等。
为了方便在Scrapy Shell中使用,需要在scrapy.cfg文件中加入如下一行:
配置完成后就可以使用scrapy shell了:
让我们从抓取一个简单的 URL 开始:
这将首先获取 /robot.txt 文件。
本例中没有robot.txt文件,所以我们会在这里看到404 HTTP状态码。如果有robot.txt文件,Scrapy默认会遵循规则。
您可以在 settings.py 文件中禁用此规则:
然后可以看到如下日志:
现在,您可以从捕获的数据中看到响应正文和响应标头,还可以使用不同的 XPath 表达式或 CSS 选择器来解析数据。
使用以下命令直接在浏览器中查看响应信息:
请注意,由于某些原因,该页面在浏览器中的显示效果可能较差。这可能是CORS问题,或者Javascript代码无法执行,或者本地URL对应的资源被加载了。
Scrapy shell 与常规 Python shell 没有什么不同,因此您可以向其中添加自定义脚本或函数。
分析数据
Scrapy 默认不执行 Javascript,所以如果你要爬取的页面是通过 Angular 或 React.js 前端框架渲染的,你可能无法抓取到想要的数据。
现在让我们尝试使用 XPath 表达式来解析产品标题和价格:
使用XPath表达式方便价格分析,选择类属性my-4的div标签后第一个span的文字:
您还可以使用 CSS 选择器:
创建一个 Scrapy 爬虫
在 Scrapy 中,Spider 是一个类,用于定义集合(需要爬取的链接或 URL)和爬取(需要解析的数据)。
以下是爬虫爬取网站所需的步骤:
您可能想知道为什么 parse() 函数可以返回这么多不同类型的对象。这是为了函数的灵活性。假设你想抓取一个没有站点地图的电商网站,你可以从抓取产品类别开始,这里是使用的第一个解析函数。
然后,该函数将为每个产品类别生成一个 Request 对象,并将其传递给新的回调函数 parse2()。对于每个类别,可能还有分页需要处理。然后将为实际抓取的每个产品生成第三个解析函数。
Scrapy 可以将捕获的数据作为简单的 Python 字典返回,但最好使用内置的 Scrapy 项目类。它是我们抓取数据时使用的简单容器。Scrapy 可以查看该项中的属性并进行很多操作,比如将数据导出为不同的格式(JSON 或 CSV 等),作为一个项目管道。
这是一个基本的 Product 类:
现在我们可以通过命令行生成爬虫:
或者您可以在 /spiders 目录中手动创建爬虫代码。
以下是 Scrapy 用来解决大部分爬虫用例的不同类型的爬虫:
在这个 EcomSpider 类中,有两个必需的属性:
allowed_domains 是可选的,但也非常重要。当您使用 CrawlSpider 时,将识别不同的域名。
然后使用我们之前看到的 XPath 表达式解析所需的数据并将其填充到 Product 字段中,并返回此项。
您可以运行以下代码将结果导出为 JSON 格式(也可以导出 CSV)。
然后你可以得到一个整洁的 JSON 文件:
物品加载器
从网页中提取数据时,您可能会遇到两个常见问题:
对此,Scrapy 提供了内置的解决方案 ItemLoaders。这是一种处理 Product 对象的有趣方式。
您可以将多个 XPath 表达式添加到同一个 Item 字段,它会按顺序测试它们。默认情况下,如果找到多个 XPath,它会将它们全部加载到列表中。
您可以在 Scrapy 文档中找到许多输入和输出处理器的示例。
当您需要转换或清理解析的数据时,此功能很有用。例如,从价格中提取货币信息,将一种单位转换为另一种单位(厘米和米、华氏和摄氏)等。
我们可以使用不同的 XPath 表达式从网页中查找产品标题://title 和 //section[1]//h2/text()。
在这种情况下,您可以使用 Itemloader:
通常要使用第一个匹配的XPath,所以需要在item的字段构造函数中添加这段代码output_processor=TakeFirst()。
在示例中,我们只希望每个字段都匹配第一个 XPath,因此最好的方法是创建自己的 Itemloader 并声明一个默认的 output_processor 以使用第一个 XPath。
我还在这里添加了一个 price_in 字段,它是一个输入处理器,用于从价格中删除美元符号。我使用的内置处理器 MapCompose 需要按顺序执行一个或多个函数。您可以根据需要添加任何函数,通常在项目中的字段名称后添加 _in 或 _out ,表示添加输入或输出处理器。