python用scrapy爬虫豆瓣_爬虫教程——用Scrapy爬取豆瓣TOP250

最好的学习方式就是输入之后再输出,分享一个自己学习scrapy框架的小案例,方便快速的掌握使用scrapy的基本方法。

本想从零开始写一个用Scrapy爬取教程,但是官方已经有了样例,所以还是不写了,尽量分享在网上不太容易找到的东西。自己近期在封闭培训,更文像蜗牛一样,抱歉。

Scrapy简介

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

如果此前对scrapy没有了解,请先查看下面的官方教程链接。

架构概览:https://docs.pythontab.com/scrapy/scrapy0.24/topics/architecture.html

Scrapy入门教程:https://docs.pythontab.com/scrapy/scrapy0.24/intro/tutorial.html

爬虫教程

首先,我们看一下豆瓣TOP250页面,发现可以从中提取电影名称、排名、评分、评论人数、导演、年份、地区、类型、电影描述。

Item对象是种简单的容器,保存了爬取到得数据。其提供了类似于词典的API以及用于声明可用字段的简单语法。所以可以声明Item为如下形式。class DoubanItem(scrapy.Item):

# 排名

ranking = scrapy.Field()

# 电影名称

title = scrapy.Field()

# 评分

score = scrapy.Field()

# 评论人数

pople_num = scrapy.Field()

# 导演

director = scrapy.Field()

# 年份

year = scrapy.Field()

# 地区

area = scrapy.Field()

# 类型

clazz = scrapy.Field()

# 电影描述

decsription = scrapy.Field()

我们抓取到相应的网页后,需要从网页中提取自己需要的信息,可以使用xpath语法,我使用的是BeautifulSoup网页解析器,经过BeautifulSoup解析的网页,可以直接使用选择器筛选需要的信息。有一些说明写到代码注释里面去了,就不再赘述。

Chrome 也可以直接复制选择器或者XPath,如下图所示。class douban_spider(Spider):

count = 1

# 爬虫启动命令

name = 'douban'

# 头部信息,伪装自己不是爬虫程序

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',

}

# 爬虫启动链接

def start_requests(self):

url = 'https://movie.douban.com/top250'

yield Request(url, headers=self.headers)

# 处理爬取的数据

def parse(self, response):

print('第', self.count, '页')

self.count += 1

item = DoubanItem()

soup = BeautifulSoup(response.text, 'html.parser')

# 选出电影列表

movies = soup.select('#content div div.article ol li')

for movie in movies:

item['title'] = movie.select('.title')[0].text

item['ranking'] = movie.select('em')[0].text

item['score'] = movie.select('.rating_num')[0].text

item['pople_num'] = movie.select('.star span')[3].text

# 包含导演、年份、地区、类别

info = movie.select('.bd p')[0].text

director = info.strip().split('\n')[0].split('   ')

yac = info.strip().split('\n')[1].strip().split(' / ')

item['director'] = director[0].split(': ')[1]

item['year'] = yac[0]

item['area'] = yac[1]

item['clazz'] = yac[2]

# 电影描述有为空的,所以需要判断

if len(movie.select('.inq')) is not 0:

item['decsription'] = movie.select('.inq')[0].text

else:

item['decsription'] = 'None'

yield item

# 下一页:

# 1,可以在页面中找到下一页的地址

# 2,自己根据url规律构造地址,这里使用的是第二种方法

next_url = soup.select('.paginator .next a')[0]['href']

if next_url:

next_url = 'https://movie.douban.com/top250' + next_url

yield Request(next_url, headers=self.headers)

然后在项目文件夹内打开cmd命令,运行scrapy crawl douban -o movies.csv就会发现提取的信息就写入指定文件了,下面是爬取的结果,效果很理想。

原文链接:https://mp.weixin.qq.com/s/eRDNn1uE-z-Oq-782kd-Dw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

context-param与init-param的区别与作用

<context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>2.紧接着,容器创建一个Servl…

如何快速批量修改文件名

文件太多&#xff0c;文件名太乱&#xff0c;希望快速批量修改文件名&#xff0c;以下的两种方法可以帮到你&#xff0c;亲测好用。 方法一 1.选中需要批量修改的文件&#xff0c;如图1 图12.按F2键&#xff0c;输入文件名。如图2. 图23.Enter&#xff0c;效果如图3. 图3方法…

【LUOGU???】WD与积木 NTT

题目大意 把 \(n\) 个有标号物品分到一些有标号的箱子中且不允许为空&#xff0c;问期望箱子的数量。 多组询问。 \(n\leq 100000\) 题解 记 \(f_i\) 为 \(i\) 个有标号物品分到一些有标号的箱子中且不允许为空的箱子的数量之和。 记 \(g_i\) 为 \(i\) 个有标号物品分到一些有标…

7对讲机调频软件_对讲机怎么配对?

有好多朋友买到了新对讲机和老对讲机的频率不一样&#xff0c;从而导致了新旧对讲机无法通联。买到了新对讲机&#xff0c;我们要先知道旧对讲机的频率是多少。要想知道旧对讲机的频率是多少&#xff0c;我们就要需要一定的工具&#xff0c;首先我们要有一台XP系统的电脑&#…

RTK、IMU、RT3000

GPS/RTK 全球卫星定位系统(GPS)的全面建成和发展&#xff0c;导致了导航和测绘行业的一场重大深刻的技术革命。常规的静态GPS测量方法越来越多地应用于高精度控制网的建立&#xff0c;但利用该方法无法在野外对观测数据进行实时检核&#xff0c;从而造成观测结果不合格而需要返…

POJ--3974 Palindrome(回文串,hash)

链接&#xff1a;点击这里 #include<iostream> #include<algorithm> #include<stdio.h> #include<cstring> using namespace std; #define maxn 1000005 #define LL long long #define ull unsigned long long const LL P 131; ull p[maxn10],f[maxn]…

Springboot 两种方式配置启动热部署(图文界面)

目录 前言1. 类加载启动2. devtools前言 Java的热部署(Hot Deployment)是指在应用程序运行时更新或替换类文件,而无需重新启动整个应用程序。 代表不停止应用程序的情况下修改代码并立即看到变化,这对于开发和调试过程非常有用。 类加载器(Class Loader): Java应用程序…

Microsoft VBScript 编译器错误 错误原因 代码大全

Microsoft VBScript 编译器错误 错误 缺少语句ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件 MicrosoftOLEDBProviderforODBCDrivers(0x80040E21)-->sql语句出错(数据类型不匹配或表名(字段名)错误或表处于编辑状态&#xff0c;或表不存在于conn打开的数据库…

hadoop3 禁用ec_Hadoop + Amazon EC2 –更新的教程

hadoop3 禁用ec在Hadoop的Wiki页面上放置了一个旧教程&#xff1a; http : //wiki.apache.org/hadoop/AmazonEC2 &#xff0c;但是最近我不得不遵循本教程&#xff0c;并且我注意到它没有涵盖某些Amazon新功能。 建议您已经熟悉Hadoop的基础来学习本教程&#xff0c;可以在Had…

libuv 原理_Libuv初理解

整体概念libuv是一个跨平台、专门写给nodejs的库&#xff0c;它的设计是围绕着事件驱动的异步I/O模型。在不同的I/O轮询机制上&#xff0c;libuv提供的不是简单抽象对象&#xff1a;handle和streams为sockets和其他实例提供了一个高级抽象。此外&#xff0c;libuv还提供了跨平台…

Matlab排序函数sort()和sortrows()

sort() 调用形式 1.Ysort(X) 对矩阵、向量或数组进行升序排列。 例1 >> amagic(4)a 16 2 3 135 11 10 89 7 6 124 14 15 1>> brand(1,4)b 0.8147 0.9058 0.1270 0.9134>> sort(a)ans 4 2 3…

[Swift]LeetCode968.监控二叉树 | Binary Tree Cameras

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

Maven神秘化

由于我的Android开发的背景下&#xff0c;我比较习惯到摇篮 &#xff0c;而不是Maven的 。 尽管我知道Gradle基于Maven&#xff0c;但我从未调查过幕后发生的事情。 在过去的一周中&#xff0c;我一直在尝试了解细节并找出Maven的不同组成部分。 什么是Maven Maven是主要用于J…

走进JVM【二】理解JVM内存区域

引言 对于C程序员&#xff0c;内存分配与回收的处理一直是令人头疼的问题。Java由于自身的自动内存管理机制&#xff0c;使得管理内存变得非常轻松&#xff0c;不容易出现内存泄漏&#xff0c;溢出的问题。 不容易不代表不会出现问题&#xff0c;一旦内存泄漏或溢出的情况发生&…

mysql一对多_mysql一对多查询合并多的一方的数据。

有时候会有这样一个需求&#xff0c;查询的一条记录需要包含另一个表的多条记录&#xff0c;并且让多条记录成为一个字段组成最终的一条记录。比较难描述&#xff0c;看例子吧。创建一个产品表&#xff1a;create table product(proId int(10),proName varchar(50))创建一个成分…

Matlab矩阵、元胞数组的合并拼接

矩阵合并拼接 1.横向拼接 [a,b] [a b]均可 例1 >> amagic(3)a 8 1 63 5 74 9 2>> brand(3)b 0.6324 0.5469 0.15760.0975 0.9575 0.97060.2785 0.9649 0.9572>> c[a,b]c 8.0000 1.0000 6.0000 0.632…

Matlab拆分矩阵/Matlab如何分割大矩阵(mat2cell函数)

dim1Dist分割后矩阵行数组成的向量&#xff0c;dimNDist指的是分割后矩阵列数组成的向量 例有100*200的矩阵A >> Arand(100,200); >> bmat2cell(A,[30 40 30],[100 70 30])b 33 cell 数组{30100 double} {3070 double} {3030 double}{40100 double} {40…

分布式系统部署、监控与进程管理的几重境界

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice t.sina.com.cn/giantchen 陈硕关于分布式系统的系列文章&#xff1a;http://blog.csdn.net/Solstice/category/802325.aspx 本作品采用“Creative Commons 署名-非商业性使用-禁止演绎 3.0 Unported 许可协议(cc by-nc-nd)”…

.net core mvc初级教程(六)

一、创建movie的视图 二、对cinema、movie视图添加‘添加信息’的操作 一、创建movie的视图 在views文件夹下添加Movie文件夹&#xff0c;在这个文件夹下添加Index.cshtml视图&#xff0c;为什么添加Index.cshtml这个名字的视图&#xff0c;可以看看我们写的MovieController控制…

apache camel_发掘Apache Camel的力量

apache camel最近几年&#xff0c;ESB软件越来越受欢迎。 如果大多数人通常知道什么是ESB&#xff0c;那么他们很少会清楚地了解这种体系结构的不同组件的确切作用。 例如&#xff0c;Apache ServiceMix由三个主要组件组成&#xff1a;Apache Karaf&#xff08;OSGI容器&#…