前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python最火爬虫框架Scrapy入门与实践,豆瓣电影 Top 250 数据采集

Python最火爬虫框架Scrapy入门与实践,豆瓣电影 Top 250 数据采集

作者头像
二爷
发布于 2020-07-22 03:34:09
发布于 2020-07-22 03:34:09
2.4K00
代码可运行
举报
文章被收录于专栏:二爷记二爷记
运行总次数:0
代码可运行

Python爬虫框架Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

scrapy安装

Linux:

pip3 install scrapy

Windows

a.

pip3 install wheel

b. 下载twisted

http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

c. 进入下载目录,

执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

d. pip3 install pywin32

e. pip3 install scrapy

强调:

如果windows10安装

pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl失败,

请自行换成32位的即可解决!!!

提示:如果在pycharm中安装scrapy失败

两种解决办法:

1、把pycharm中的虚拟环境模式改成直接指向现在的python安装环境!

2、把python环境中的scrapy,twisted等直接复制到pycharm工程所在的虚拟环境中去!

Scrapy组件:

引擎(Scrapy)

用来处理整个系统的数据流处理, 触发事务(框架核心)

调度器(Scheduler)

用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

下载器(Downloader)

用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

爬虫(Spiders)

爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

项目管道(Pipeline) 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

下载器中间件(Downloader Middlewares)

位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

爬虫中间件(Spider Middlewares)

介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。

调度中间件(Scheduler Middewares)

介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

Scrapy运行流程

Scrapy运行流程大概如下:

引擎从调度器中取出一个链接(URL)用于接下来的抓取

引擎把URL封装成一个请求(Request)传给下载器

下载器把资源下载下来,并封装成应答包(Response)

爬虫解析Response

解析出实体(Item),则交给实体管道进行进一步的处理

解析出的是链接(URL),则把URL交给调度器等待抓取

* 解释:引擎首先会将爬虫文件中的起始url获取,并且提交到调度器中。如果需要从url中下载数据,则调度器会将url通过引擎提交给下载器,下载器根据url去下载指定内容(响应体)。下载好的数据会通过引擎移交给爬虫文件,爬虫文件可以将下载的数据进行指定格式的解析。如果解析出的数据需要进行持久化存储,则爬虫文件会将解析好的数据通过引擎移交给管道进行持久化存储。

爬取目标网址:

https://movie.douban.com/top250

第一步:创建 Scrapy 项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy startproject douban

由于这里使用的是pycham ide,创建运行调试文件

pycham ide调试文件代码

新建py文件 entrypoint.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from scrapy.cmdline import execute
execute(['scrapy','crawl','douban'])

注意:douban 是 Scrapy项目名

第二步:设置字段

items.py

引入 scrapy框架

设置字段格式:字段名=scrapy.Field()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scrapy
 
class DoubanItem(scrapy.Item):
    num=scrapy.Field() #序列号
    name=scrapy.Field() #电影名
    introduce=scrapy.Field() #介绍
    star=scrapy.Field() # 星级评分
    appraise=scrapy.Field() # 评价人数
    survey=scrapy.Field() #一句话介绍

第三步:相关设置修改

settings.py

1.开启协议头

爬取豆瓣网站,需要开启协议头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'

2.抓取调试开启

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Enable and configure HTTP caching (disabled by default)
# See [url=https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings]https://docs.scrapy.org/en/lates ... middleware-settings[/url]
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

这里开启的含义: 这几行注释的作用是,Scrapy会缓存你有的Requests!当你再次请求时,如果存在缓存文档则返回缓存文档,而不是去网站请求,这样既加快了本地调试速度,也减轻了 网站的压力。

3.激活item pipeline

我们的pipeline定义后,需要在配置文件中添加激活才能使用,因此我们需要配置settings.py。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ITEM_PIPELINES = {
    'douban.pipelines.DoubanPipeline': 300,
}

注意,这里不开启,存储不了数据!

第四步:爬虫文件的编写,关键!

doub.py

版本一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import scrapy
import requests
from douban.items import DoubanItem
from bs4 import BeautifulSoup
from scrapy.http import Request

class DoubSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls=["https://movie.douban.com/top250"]


    def parse(self, response):
        item_list=response.xpath('//ol[@class="grid_view"]/li')
        for item in item_list:
            douban_item=DoubanItem()
            douban_item['num'] = item.xpath('.//div[@class="pic"]/em/text()').extract_first()
            douban_item['name']=item.xpath('.//div[@class="hd"]/a/span[1]/text()').extract_first()
            #print(douban_item['name'])
            introduces=item.xpath('.//div[@class="bd"]/p[1]/text()').extract()
            for introduce in introduces:
                introduce_date="".join(introduce.split())
                douban_item['introduce']=introduce_date
                #print(douban_item['introduce'])
            douban_item['star']=item.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
            #print(douban_item['star'])
            douban_item['appraise'] = item.xpath('.//div[@class="star"]/span[4]/text()').extract_first()
            douban_item['survey']=item.xpath('.//p[@class="quote"]/span[@class="inq"]/text()').extract_first()
            #print(douban_item['survey'])
            print(douban_item)
            yield douban_item
        next_page=response.xpath('//div[@class="paginator"]/span[@class="next"]/a/@href').extract()
        if next_page:
            yield Request(f'https://movie.douban.com/top250{next_page[0]}',callback=self.parse)

版本二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def parse(self, response):
    paginator_urls=[]
    paginator_urls.extend(self.start_urls)
    paginators=BeautifulSoup(response.text,'lxml').find('div',class_="paginator").find_all('a')[:-1]
    for paginator in paginators:
        paginator=f"https://movie.douban.com/top250{paginator['href']}"
        paginator_urls.append(paginator)
    print(paginator_urls)
    paginator_urls=set(paginator_urls)
    for paginator_url in paginator_urls:
        print(paginator_url)
        yield Request(paginator_url,callback=self.get_content)

def get_content(self,response):
    thispage=BeautifulSoup(response.text,'lxml').find('span',class_="thispage").get_text()
    print(thispage)

Scrapy自带xpath 与爬虫 etree xpath类似 注意.extract() 和.extract_first()

在使用scrapy爬虫的时候,我们常常使用xpath来获取html标签,但是我们经常会用到提取的方法

有两种提取的方法

分别是:

extract():

这个方法返回的是一个数组list,里面包含了多个string,如果只有一个string,则返回['ABC']这样的形式。

extract_first():

这个方法返回的是一个string字符串,是list数组里面的第一个字符串。

Xpath选择器:

response.selector属性返回内容相当于response的body构造了一个Selector对象。

Selector对象可以调用xpath()方法实现信息的解析提取。

在xpath()后使用extract()可以返回所有的元素结果。

若xpath()有问题,那么extract()会返回一个空列表。

在xpath()后使用extract_first()可以返回第一个元素结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for v in dllist:
     print(v.xpath("./dt/text()").extract_first())
     print("="*50)
     alist = v.xpath(".//a")
     for a in alist:
             print(a.xpath("./@href").extract_first(),end=":")
             print(a.xpath("./span/img/@alt").extract_first())
             
#来源:CSDN博主「周雄伟」

版本二为调用bs4抓取数据

但是代码、排序等等不完美,推荐版本一!

第五步:保存数据,写入本地数据库

pipelines.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pymysql
 
class DoubanPipeline(object):
    def __init__(self):
        #连接MySQL数据库
        self.connect=pymysql.connect(
            host="localhost",
            user="root",
            password="123456",
            db="xiaoshuo",
            port=3306,
        )
        self.cursor=self.connect.cursor()
    def process_item(self, item, spider):
        self.cursor.execute('insert into movie(num,name,introduce,star,appraise,survey)VALUES("{}","{}","{}","{}","{}","{}")'.format(item['num'],item['name'],item['introduce'],item['star'],item['appraise'],item['survey']))
        self.connect.commit()
        return item
 
    #关闭数据库
    def close_spider(self,spider):
        self.cursor.close()

项目:

数据:

运行效果:

scrapy数据保存为 csv 方法:

在Scrapy中,负责导出数据的组件被称为Exporter,Scrapy内部实现了多个Exporter,每个Exporter实现一种数据格式的导出,

支持的格式如下:

JSON(JsonItemExporter)

JSON lines(JsonLinesItemExporter)

CSV(CsvItemExporter)

XML(XmlItemExporter)

Pickle(PickleItemExporter)

Marshal(MarshalItemExporter)

cmd命令方法

1.cd进入项目文件

2.敲入命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy crawl douban -o douban.csv

由于未指定编码,所以导致保存输出文件为乱码

指定一下 utf-8 编码 格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy crawl douban -o douban.csv -s FEED_EXPORT_ENCIDING=utf-8

或者

使用第三方软件修改编码格式,notepad2打开,选择编码ANSI,保存,再用excel打开就是正常的了!

最后的解决办法

在创建项目的settings.py中,添加如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FEED_EXPORT_ENCODING = 'gb18030'

即可解决乱码问题。

第六步:代{过}{滤}理ip的使用

由于没有账号,未测试。。

项目打包

链接:

https://pan.baidu.com/s/1GX9srMbh7aJbbpC8y6ZzDw

提取码:

zp3h

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与SEO学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#操作INI文件的案例分享
kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。 以上来自百度百科
用户7718188
2022/11/06
8100
VS2017生成DLL(C语言)文件并在C#中使用
下面我们将在VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件)
zls365
2021/01/28
2.4K0
.NET资源泄露与处理方案
很常见的现象是分不清哪些对象需要释放,对于控件、Stream等一些非托管资源也只管新增,却没有释放,功能是实现了,却埋了颗不小的雷。
梁规晓
2019/11/28
8270
C# —— 利用Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托
原来是为了在游戏外挂中发送键盘鼠标消息,自己写个sendmessage或者是postmessage又比较麻烦。于是google了一下,发现现在很多脚本工具都有这个功能,其中按键精灵的一个叫361度的插件已经有这个的实现,还验证过了。为什么不拿来己用呢? 首先分析一下按键精灵插件的接口,发现:
vv彭
2021/03/08
3.2K0
C# —— 利用Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托
c#钩子学习笔记(一)
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
冰封一夏
2019/09/10
7170
C#操作INI配置文件示例
该文章介绍了如何用C#操作INI配置文件,包括读取和写入配置项。文章首先介绍了INI文件的结构和配置项的命名,然后讲解了如何在C#中读取和写入配置项。最后,文章提供了一个示例,演示了如何使用这些API来读取和写入配置项。
CNXY
2017/12/25
1.3K0
C#操作INI配置文件示例
C# Producer Consumer (生产者消费者模式)demo
第一套代码将producer Consumer的逻辑写到from类里了,方便在demo的显示界面动态显示模拟生产和消费的过程。 第二套代码将producer Consumer的逻辑单独写到一个类中,使用委托的方法在from中回显生产消费的过程。 Demo中均以3个线程作为消费者,1个线程作为生产者为例。 。
zls365
2021/01/13
1.3K0
C# Producer Consumer (生产者消费者模式)demo
C#_对内存的操作
最近一直不务正,老打算用C#写个外挂出来。 这方面对C#来说是个弱项,但并不表示无法做到。 下面写个简单的例子,和大家交流一下。 以windows中的扫雷为例,比如说读取雷的数量。 1.首先导入API(对底层的操作都要用API):
zls365
2021/03/16
7780
C# API操作实例
/*c#在调用c++方法或者window api时不能象调用c#本身写的dll类库那样直接通过引用dll就可以调用相应的方法, 而是要把要引用的dll放到bin中,现通过[DllImport("User32.dll")]引用*/
zls365
2020/08/19
6350
C# API操作实例
C# winform键盘钩子
http://blog.163.com/da7_1@126/blog/static/1040726782011112652629750/
全栈程序员站长
2022/08/31
4650
手把手带你开发一款 IIS 模块后门
记得之前看一篇 APT 组织的报告时偶然间看到过 IIS 模块后门然后在网上找了找了资料,想自己开发一款然后开发到一半因为一些事情就停止了很久,这次清理项目文件的时候又有想了起来就打算重新用 C# 继续写出来。
信安之路
2019/09/17
1.9K0
手把手带你开发一款 IIS 模块后门
c#对象保存Demo
MaybeHC
2024/04/23
750
c#对象保存Demo
通过一个示例形象地理解C# async await异步
相信大家看过不少讲C# async await的文章,但还是有很多C#程序员不明白。如果搞不明白,其实也不影响使用。但有人就会疑惑,为什么要用异步?我感觉它更慢了,跟同步有啥区别?有的人研究深入,比如去研究状态机,可能会明白其中的原理。但深入研究的毕竟少数。有的人写一些示例,有的专业有的不是很专业,但看的人仍有不明白的。所以我写了一个示例,尽量简单,让大家形象地理解一下C#的异步。就是一个示例,没有什么理论讲解,大家自己测试自己思考。如果大家看理论讲解,就能明白,我也就没必要写这个示例了。
郑子铭
2023/02/12
1.3K1
通过一个示例形象地理解C# async await异步
C# 实现 WinForm 全屏置顶
我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式(使其它应用窗体无法遮挡在置顶应用窗体之上),并且进入全屏状态。本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能。
初九之潜龙勿用
2024/12/11
1430
C# Socket TCP发送图片与接收图片
https://blog.csdn.net/yuhijk2055/article/details/87935783
zls365
2020/08/19
4.2K1
C# Socket TCP发送图片与接收图片
C# 进程间通讯
进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。
zls365
2021/01/13
1.5K0
C# 进程间通讯
C# 答群友:把窗体应用改成类库输出然后去引用
类库你就新建类库文件直接生成dll去引用好了,但是群友非要骚操作,新建一个windows窗体把他搞成dll去引用,当时我回答了这个问题是可以的,但是实际上我没有这么干过,今天恰好有空,体验了一把,的确可以。
用户9127601
2021/11/01
2690
C#控制键盘按键(大小写按键等)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace sn设置键盘大小写 { public partial class Form1
用户8671053
2021/11/02
1.4K0
C#基于yolov3的行人检测
yolo_cpp_dll中的yolo_v2_class.cpp需要修改下构造函数detect_image
zls365
2020/08/19
1.3K0
C#基于yolov3的行人检测
Wallpaper的原理和C#实现(含源文件)
wallpaper是一款优秀的动态壁纸软件,除了播放动画以外,还可以执行程序,甚至可以实时响应鼠标移动。
DearXuan
2022/01/19
2.4K0
Wallpaper的原理和C#实现(含源文件)
相关推荐
C#操作INI文件的案例分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文