scrapy分页抓取网页(Python中一个非常棒的网页抓取网页中常见的问题)

优采云 发布时间: 2021-10-11 16:06

  scrapy分页抓取网页(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 ,表示添加输入或输出处理器。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线