scrapy分页抓取网页(Python爬虫进阶教程)

优采云 发布时间: 2022-01-21 00:15

  scrapy分页抓取网页(Python爬虫进阶教程)

  前言:

  学Python很久了,之前用正则表达式和BeautifulSoup写过很多爬虫。Scrapy是爬虫进阶部分的必知。在我对 Scrapy 有一定的熟悉之后,我也想通过这个教程。帮助一些想学习Scrapy的人,毕竟爬虫还是很有趣的。

  Scrapy 是一个应用程序框架,用于抓取 网站 数据并提取结构化数据。它可以用于一系列程序,包括数据挖掘、信息处理或存储历史数据。它最初是为网页抓取(更准确地说,网页抓取)而设计的,但也可用于获取 API(例如 Amazon Associates Web 服务)或通用网络爬虫返回的数据。它也是一个高级屏幕抓取和网页抓取框架,用于抓取网站并从页面中提取结构化数据。Scrapy 用途广泛,可用于数据挖掘、监控和自动化测试。

  Scrapy 的吸引力在于它是一个任何人都可以根据自己的需要轻松修改的框架。还提供了各种爬虫的基类,如BaseSpider、sitemap爬虫等。最新版本提供了对web2.0爬虫的支持。最新的官方版本是scrapy1.5。

  Scratch 是爬行的意思。这个 Python 爬虫框架叫做 Scrapy,大概意思是一样的。我们称之为:小刮。

  Scrapy 使用 Twisted 异步网络库来处理网络通信。整体架构大致如下:

  ​

  

  各个组件的作用 Scrapy Engine 引擎负责控制系统中所有组件中数据的流动,并在相应的动作发生时触发事件。有关详细信息,请参阅下面的数据流部分。

  这个组件相当于爬虫的“大脑”,是整个爬虫的调度中心。

  调度器(Scheduler) 调度器接受来自引擎的请求,并将它们排入队列以便在引擎稍后请求它们时提供给引擎。

  页面中获取的初始爬取URL和后续待爬取的URL将被放入调度器等待爬取。同时调度器会自动去除重复的URL(如果特定的URL不需要去重,也可以通过设置来实现,比如post请求的URL)

  下载器(Downloader) 下载器负责获取页面数据并提供给引擎,然后提供给蜘蛛。SpidersSpider 是 Scrapy 用户编写的一个类,用于分析响应并提取项目(即获取的项目)或 URL 以进行额外的跟进。每个蜘蛛负责处理一个特定的(或一些)网站。Item Pipeline Item Pipeline 负责处理spider提取的item。典型的过程是清理、验证和持久性(例如,访问数据库)。

  当爬虫需要解析的页面需要的数据存储在Item中后,会被发送到项目流水线(Pipeline),数据会按照几个特定的​​顺序进行处理,最后存储到本地文件或在数据库中。

  下载器中间件(Downloader middlewares) 下载器中间件是引擎和下载器之间的特定钩子,负责处理下载器传递给引擎的响应。它提供了一种通过插入自定义代码来扩展 Scrapy 功能的简单机制。

  通过设置下载器中间件,爬虫可以自动替换user-agent、IP等功能。

  蜘蛛中间件(Spider middlewares) 蜘蛛中间件是引擎和蜘蛛之间的特定钩子(specific hook),处理蜘蛛输入(响应)和输出(项目和请求)。它提供了一种通过插入自定义代码来扩展 Scrapy 功能的简单机制。数据流引擎打开一个 网站(打开一个域),找到处理 网站 的蜘蛛,并向蜘蛛请求要抓取的第一个 URL。引擎从 Spider 获取第一个要抓取的 URL,并在 Scheduler 中使用 Request 对其进行调度。引擎向调度程序询问下一个要抓取的 URL。调度器将下一个要爬取的URL返回给引擎,引擎通过下载中间件(请求方向)将该URL转发给下载器(Downloader)。页面下载后,下载器为页面生成一个Response,并通过下载中间件(响应方向)发送给引擎。引擎从下载器接收到Response,通过Spider中间件(输入方向)发送给Spider进行处理。Spider 处理 Response 并将爬取的 Item 和(后续)新的 Request 返回给引擎。引擎将爬取的Item(由Spider返回)发送到Item Pipeline,并将Request(由Spider返回)发送给调度程序。重复(从第 2 步开始),直到调度程序中没有更多请求并且引擎关闭 网站。Spider 处理 Response 并将爬取的 Item 和(后续)新的 Request 返回给引擎。引擎将爬取的Item(由Spider返回)发送到Item Pipeline,并将Request(由Spider返回)发送给调度程序。重复(从第 2 步开始),直到调度程序中没有更多请求并且引擎关闭 网站。Spider 处理 Response 并将爬取的 Item 和(后续)新的 Request 返回给引擎。引擎将爬取的Item(由Spider返回)发送到Item Pipeline,并将Request(由Spider返回)发送给调度程序。重复(从第 2 步开始),直到调度程序中没有更多请求并且引擎关闭 网站。

  工具: 语言:python 3.6IDE:Pycharm 浏览器:Chrome 71.0 爬虫框架:Scrapy 1.5 安装教程:

  1.直接使用Pycharm安装,省去不必要的麻烦,点击File->Settings For Project。然后点击+号并搜索scrapy进行安装。

  

  ​

  

  2.安装完成后进入我们创建的目录,在该目录下输入cmd命令。

  scrapy startproject douban

  

  3.我们用pycharm打开项目看看:

  

  ​

  下面简单介绍一下各个文件的作用:

  好了,我们已经完成了对目录的了解。在我们开始之前,我会给你一个小技巧。Scrapy 默认无法在 IDE 中调试。我们在根目录下新建一个py文件,名为:entrypoint.py;在里面写下以下内容:

  from scrapy.cmdline import execute

execute(['scrapy', 'crawl', 'douban'])

  现在整个目录如下所示:

  

  构建项目后:

  首先是在 items.py 文件中定义一些字段,这些字段是用来临时存储你需要保存的数据。以后可以方便的将数据保存到其他地方,比如数据库或者本地文本。

  第二件事在蜘蛛文件夹中编写自己的爬虫

  第三件事将自己的数据存储在 pipelines.py

  还有一件事,没必要做,settings.py文件不用编辑,需要的时候才编辑。

  2.明确目标(Item)物品

  爬取的主要目标是从非结构化数据源中提取结构化数据,例如网页。Scrapy spider 可以使用 python 的 dict 返回提取的数据。dict虽然使用起来非常方便和熟悉,但缺乏结构,容易打错字段名或返回不一致的数据,尤其是在多爬虫的*敏*感*词*情况下。在项目中。

  为了定义通用的输出数据,Scrapy 提供了 Item 类。Item 对象是一个简单的容器,用于保存爬网数据。它提供了类似字典的 API 和用于声明可用字段的简单语法。

  许多 Scrapy 组件使用 Item 提供的额外信息:exporter 根据 Item 声明的字段导出数据,序列化可以通过 Item 字段的元数据定义,trackref 跟踪 Item 实例以帮助查找内存泄漏(请参阅 Debugging with trackref 内存泄漏)等。

  Item 对象是一个简单的容器,用于保存爬网数据。它提供了类似字典的 API 和用于声明可用字段的简单语法。

  在 Scrapy 中,项目是用于加载抓取的内容的容器,提供了一些额外的防止错误的保护。

  通常,可以使用 scrapy.item.Item 类和使用 scrapy.item.Field 对象定义的属性来创建项目。

  接下来,我们开始构建项目模型(model)。

  首先,我们想要的是:

  使用简单的类定义语法和 Field 对象来声明项目。我们打开scrapyspider目录下的items.py文件,编写如下代码声明Item:

  

  这完成了我们的第一步!这么容易吗?ヾ(´▽')ノ; 写蜘蛛(也就是我们用来提取数据的爬虫):

  3.做一只蜘蛛(蜘蛛)

  制作爬虫一般分为两步:先爬,再拉。

  也就是首先你要获取整个页面的所有内容,然后取出对你有用的部分。

  要创建一个 Spider,你必须继承 scrapy.spider.BaseSpider 并定义三个强制属性:

  创建douban_spider.py文件,保存在douban\spiders目录下。并导入我们需要的模块

  

  编写主模块:

  

  然后运行它,

  

  你会看到 403 错误,因为我们在爬取的时候没有添加 header:

  

  让我们假设,将 USER_AGENT 添加到 settings.py:

  USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, 像 Gecko) Chrome/19.0.1084.54 Safari/536.5'

  再次运行它以查看正确的结果。

  4.提取网页信息

  我们使用 xpath 语法来提取我们需要的信息。不熟悉xpath语法的可以在W3School网站中学习,可以快速上手,难度不高。首先,我们在chrome浏览器中进入豆瓣电影TOP250页面,按F12打开开发者工具。

  

  ​

  

  我们可以看到每部电影的信息都在一个....打开后,我们可以找到我们想要的所有信息。蜘蛛中的初始请求是通过调用 start_requests() 获得的。start_requests() 读取 start_urls 中的 URL 并生成 Request 和 parse 作为回调函数。,看一下代码:

  

  运行爬虫

  在项目文件夹中打开 cmd 并运行以下命令:

  scrapy爬取douban_top250 -o douban.csv

  注意这里的douban_movie_top250是我们刚才写的爬虫的名字,-o douban.csv是scrapy提供的一个快捷方式,可以将item输出为csv格式。py 设置一些编码格式:

  FEED_EXPORT_ENCODING = 'GBK'

  另外,在python包下exporters.py中的CsvItemExporter类的io.TextIOWrapper中添加参数newline='',取消csv的自动换行

  

  再次运行上述命令,我们想要的信息全部下载到douban.scv文件夹中:

  

  通过以上工作,我们已经完成了第一页的页面信息爬取,接下来我们需要爬取所有页面的信息。

  自动翻页

  实现自动翻页一般有两种方式:

  在当前页中查找下一页的地址;根据 URL 的变化规律,自己构建所有的页面地址。

  一般情况下我们使用第一种方式,第二种方式适用于页面的下一页地址是JS加载的情况。

  

  观察该页面的网页源代码后可以得到,直接拼接URL就可以得到下一页的链接。

  

  再次运行结果打开douban.csv。有没有发现所有的视频信息都拿到了,250个不超过1个,而且不超过1个,哇。

  

  最后,使用 Excel 的过滤功能,您可以过滤任何符合您要求的视频。(PS:Excel可以直接打开csv进行操作)

  结尾

  自从写了这篇Scrapy爬虫框架教程后,在调试过程中遇到了一些小问题,通过谷歌和Stack Overflow基本完美解决。通过阅读官方的scrapy文档,我也加深了对scrapy的理解。如果有什么不对的地方,请纠正我。有一系列的听证会,有艺术专长,每个人都互相学习。

  我的CSDN同名博客文章:豆瓣爬虫

  源码地址:jhyscode/scrapy_doubanTop250

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线