热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scrapy爬取豆瓣Top250电影和灌篮高手漫画全集

爬取豆瓣Top250电影为了寻找练手的项目,搜索了无数文档,自己总结了一套关于scrapy写spider的“标准”模板,稍后奉上。在这无数文档中,不知道是出于什么原因,要我说至少有
爬取豆瓣Top250电影

为了寻找练手的项目,搜索了无数文档,自己总结了一套关于scrapy写spider的“标准”模板,稍后奉上。在这无数文档中,不知道是出于什么原因,要我说至少有一半提到了爬取豆瓣top250电影,那我也只能先爬为敬了。

如果你看懂了我上一篇文章,那么爬豆瓣就很简单了,废话不多说,我直接上代码:

import scrapy
class doubantop250(scrapy.Spider):
name = "doubantop250"
headler = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36',
#'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
start_urls = [
'https://movie.douban.com/top250'
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse, headers=self.headler)
def parse(self, response):
for lists in response.css('ol.grid_view li div.item'):
yield {
"名次": lists.css('div.pic em::text').extract(),
"信息": lists.css('div.info div.bd p::text').extract(),
"电影名": lists.css('div.info div.hd a span.title::text').extract(),
"评分":lists.css('div.info div.bd div.star span.rating_num::text').extract(),
"引言": lists.css('div.info div.bd p.quote span.inq::text').extract()
}
next_page = response.css('div.paginator span.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse, headers=self.headler)

同样的css表达式scrapy shell抓不到东西?

这是因为shell里生成的request默认是没有带User-agent字段的,这个字段在反爬技术中很重要,怎么解决呢?也很简单,给它一个User-agent呀。在shell里输入:

>>> header = {
... 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36',
... }
>>> from scrapy import Request
>>> req = scrapy.Request(url='https://movie.douban.com/top250', headers=header)
>>> fetch(req)
爬取灌篮高手漫画全集

这是我发现的另一个觉得很有帮助的例子:Python3网络爬虫(十二):初识Scrapy之再续火影情缘,作者爬取了一个盗版漫画网站上的火影漫画。我觉得这篇文章最可取之处是教我们系统化的使用Scrapy编写爬虫,我从中学到了很多东西。另外我个人并没有看过火影,我爬灌篮高手好了。

作者的思路也很值得借鉴。

分析并提取所有可能用到的URL

这里我就直接列出来了,和作者写的可能有点不一样,但大同小异。想看具体分析过程的可以参考作者的原文档。之前我以为这一步是最难的,其实现在看来这一步其实是最简单的。

# 章节的名字
response.xpath("//dl/dd/a[1]/text()").extract()
# 章节的链接
response.xpath("//dl/dd/a[1]/@href").extract()
# 每张的总页数
response.xpath("//tr/td/text()").re("共(\d+)页")[0]
# script脚本内容
response.xpath('//script/text()').extract()

关于代码

代码我就不贴了,原作者在Github上传了完整的源代码,这里我讲一下我对这部分代码的理解。

逻辑

先说下这个爬虫的逻辑, 整个爬取过程中涉及到的URL一共有三种,第一种是每一章的标题和链接,第二种是每一章节中每张图片的链接,作者把每一章的图片分成了两部分:第一张图片和剩下所有的图片,然后分别写了三个parse方法来处理。

在scrapy的sipders模块里,你只需要用yield不断的抛出request或item,其中每个request会根据其包含的url和callback函数再次进入spider的某个处理方法里进行处理;item则会被pipelines.py里的pipeline处理。(想一想前面文章里的那张scrapy机构图)。这里提一点,spider抛出的item会被所有的pipeline轮流处理一变,处理的顺序是根据settings.py里的ITEM_PIPELINES冒号后面的数字决定,值越小优先级越高。Item的格式在items.py里定义。

细节一点?

comic_spider.py

在parse1中,新建了item对象,每个Item包含了章节名、章节链接、图片链接以及图片保存的路径,但是在parse1中其实只用到了章节名和章节链接两项。这里我们已经知道,章节链接和漫画的主页面的链接的域名是不一样的,因此我们在parse1的最后抛出一个请求,它对应了章节链接以及一个代表item的meta值,同时回调parse2来处理这一系列的请求。

在parse2中,我们通过从request中获取meta值的方式来获取要处理的item对象。在这个方法中,我们要分析出每个章节一共有多少张图片以及第一张图片的URL是什么。这里面涉及到一系列的正则和字符串处理操作,就不细说了,如果看不懂代码,建议在shell模式下把每一步的结果都打印出来看看,可以帮助理解。我们把第一张图片的URL存入item中,然后在最后抛出包含这一章所有图片的URL的请求,比如说如果这一章有122张图片,就会抛出121个请求,当然每个请求都包含了一个代表item的meta值,这些请求都会回调parse3方法。

那么第一张图片是怎么处理呢?很简单直接yield带有第一张图片url的item对象即可,后面会说pipeline是怎么处理这些item的。这里还有一点要注意,虽然每张图片所在的网页是按照1,2,3,4,5…进行编号的,但是图片本身的img_url是由script生成的,它需要你在每个网页里抓取,并存在item[‘img_url’]里。

在parse3中,因为parse2中抛出的每一条请求都对应了一个网页,也就是对应了一张图片,我们只需要将每张网页里的图片的url抓取出来即可,接着我们把这个url存入item中,并抛出item。

pipelines.py

还记得我们在comic_spider.py中抛出的item吗?这里会处理,在这个爬虫中,我们只会用到一个pipeline。首先我觉得需要对所有被抛出的item有个概念,这么多item是分类的?以第一章为例,橄榄高手第一章有122张图片,也就是122个item,其中每个item都带有章节名,章节链接和需要保存的路径(每章第一张图片的item由parse2抛出,其余的由parse3抛出)。那么在pipeline中,我们做的就是将每个item对应的内容保存到本地,假设我们需要保存的路径是d:/,那么最后我们要写入的地址就是d:/ + 章节名 + 图片名字.jpg。这里有一点取巧的地方就是我们用图片所在网页里那个数字作为每张图片的名字,因为它正好对应了图片的顺序,所以在图片都下载下来后顺序不会乱。

settings.py

scrapy1.5的settings.py已经有很详细的注释了,当然官方文档有更详细的注释:Settings。

结果

最后自然是运行这个爬虫程序,说实话,看着程序在运行同时文件夹里的内容逐渐增加时心里还是有成就感的,即使这个程序不是我原创的。从文件夹中的内容增加的过程可以看出,scrapy的框架采用的是异步策略(为什么?)。今天还找到一个介绍scrapy的视频,容我观摩一番,再写一篇详细点的关于scrapy的文章。


推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 在今天的实践中,我深入学习了网页图像抓取技术,通过编写爬虫程序批量获取网站上的图片资源。具体来说,我选择了一个包含大量高质量图片的网站作为练习对象,并成功实现了将这些图片批量下载到本地存储。这一过程不仅提升了我对爬虫技术的理解,还增强了我的编程能力。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • 在前一篇文章中,我们介绍了如何使用Requests库发送GET请求。本文将深入探讨如何通过Requests库发送POST请求,包括参数格式、请求封装等关键技巧,并通过“历史上的今天”API实例进行详细说明。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 软件测试工程师必备:全面解析Web应用的浏览器兼容性测试方法与工具
    随着市场上浏览器种类的不断增多,特别是在平板和移动设备上的普及,确保网站在各种浏览器中都能正常运行变得尤为重要。本文将深入探讨Web应用的浏览器兼容性测试方法与工具,帮助软件测试工程师全面掌握这一关键技能,以提高应用的用户体验和可靠性。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
author-avatar
淡月如水夜宿雨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有