Python Scrapy 爬虫入门: 爬取豆瓣电影top250

2023-05-16

一、安装Scrapy

cmd 命令执行

pip install scrapy

二、Scrapy介绍

Scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容或者各种图片。

  • Scrapy Engine(引擎):Scrapy框架的核心部分。负责在Spider和ItemPipeline、Downloader、Scheduler中间通信、传递数据等。
  • Spider(爬虫):发送需要爬取的链接给引擎,最后引擎把其他模块请求回来的数据再发送给爬虫,爬虫就去解析想要的数据。这个部分是我们开发者自己写的,因为要爬取哪些链接,页面中的哪些数据是我们需要的,都是由程序员自己决定。
  • Scheduler(调度器):负责接收引擎发送过来的请求,并按照一定的方式进行排列和整理,负责调度请求的顺序等。
  • Downloader(下载器):负责接收引擎传过来的下载请求,然后去网络上下载对应的数据再交还给引擎。
  • Item Pipeline(管道):负责将Spider(爬虫)传递过来的数据进行保存。具体保存在哪里,应该看开发者自己的需求。
  • Downloader Middlewares(下载中间件):可以扩展下载器和引擎之间通信功能的中间件。
  • Spider Middlewares(Spider中间件):可以扩展引擎和爬虫之间通信功能的中间件。

架构图:

 

三、安装MongoDB

https://www.mongodb.com/download-center/community     选择版本下载

我安装的是zip解压版:

1.解压、重命名文件夹,我放在 : D:\Java\NoSQL\mongodb4.2.7

2.新建文件夹: D:\Java\NoSQL\mongodb_data\log    、  D:\Java\NoSQL\mongodb_data\db  

3.在mongodb4.2.7文件夹下新建 mongod.cfg , 编辑内容

systemLog:
    destination: file
    path: D:\Java\NoSQL\mongodb_data\log\mongod.log
storage:
    dbPath: D:\Java\NoSQL\mongodb_data\db

4.安装服务: 

cd D:\Java\NoSQL\mongodb4.2.7\bin
mongod.exe --config D:\Java\NoSQL\mongodb4.2.7\mongod.cfg --install

5.启动mongodb

 

四、新建scrapy 项目

scrapy startproject scrapy_demo

创建后的项目结构:

  • cfg   项目的配置文件
  • settings.py  项目的设置文件
  • items.py   定义item数据结构的地方
  • 生成spider.py ,用来定义正则表达式 :  进入spiders文件夹,执行命令:scrapy genspider douban_spider movie.douban.com  域名为要爬的网站

明确目标

编辑items.py,定义数据结构

import scrapy

class ScrapydemoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 序号
    serial_number = scrapy.Field()
    # 电影名称
    movie_name = scrapy.Field()
    # 电影介绍
    introduce = scrapy.Field()
    # 星级
    star = scrapy.Field()
    # 电影评论数
    evaluate = scrapy.Field()
    # 电影描述
    describe = scrapy.Field()

编辑 Spider.py

import scrapy

class DoubanSpiderSpider(scrapy.Spider):
    # 这里是爬虫名称
    name = 'douban_spider'
    # 允许的域名
    allowed_domains = ['movie.douban.com']
    # 入口url ,扔到调度器里面
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        print(response.text)

修改setting.py

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'

爬取内容

执行:scrapy crawl douban_spider

进一步编辑

在项目应用文件夹下新增main.py

from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider'.split())

修改douban_spider.py

# -*- coding: utf-8 -*-
import scrapy

from scrapyDemo.items import ScrapydemoItem


class DoubanSpiderSpider(scrapy.Spider):
    # 这里是爬虫名称
    name = 'douban_spider'
    # 允许的域名
    allowed_domains = ['movie.douban.com']
    # 入口url ,扔到调度器里面
    start_urls = ['https://movie.douban.com/top250']

    # 默认的解析方法
    def parse(self, response):
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        # 循环电影的条目
        for item in movie_list:
            douban_item = ScrapydemoItem()
            douban_item['serial_number'] = item.xpath(".//div[@class='item']//em/text()").extract_first()
            douban_item['movie_name'] = item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()
            content = item.xpath(".//div[@class='info']//div[@class='bd']/p[1]/text()").extract()
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduce'] = content_s
            douban_item['star'] = item.xpath(".//span[@class='rating_num']/text()").extract_first()
            douban_item['evaluate'] = item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
            douban_item['describe'] = item.xpath(".//p[@class='quote']/span/text()").extract_first()
            yield douban_item

        # 解析下一页
        next_link = response.xpath("//span[@class='next']/link/@href").extract()
        if next_link:
            next_link = next_link[0]
            yield scrapy.Request("https://movie.douban.com/top250" + next_link, callback=self.parse)

运行main.py  , 可以看到已经爬到了数据

 保存数据

导出到json

scrapy crawl douban_spider -o test.json

导出到CSV :  到处到CSV的需要转 UTF-8-BOM

scrapy crawl douban_spider -o test.csv

保存到MongoDB 

修改settings.py 找到下面代码,取消注释

ITEM_PIPELINES = {
   'scrapyDemo.pipelines.ScrapydemoPipeline': 300,
}

修改pipelines.py

import pymongo


class ScrapydemoPipeline:

    def __init__(self):
        host = "localhost"
        port = 27017
        dbname = "douban"
        sheetname = "movie"
        client = pymongo.MongoClient(host=host,port=port)
        mydb = client[dbname]
        self.post = mydb[sheetname]

    def process_item(self, item, spider):
        data = dict(item)
        self.post.insert(data)
        return item

运行main.py,  已保存到mongodb

 IP代理中间件

如果直接爬,可能会被反爬,就无法抓取网页,所以需要使用ip代理中间件,这里使用的是阿布云

编辑middlewares.py

class my_proxy(object):
    def process_request(self,request,spider):
        request.meta['proxy'] = 'http-cla.abuyun.com:9030'
        proxy_name_pass = b'XXXXXXXXXXXXXX:XXXXXXXXXXXXXX'   # 账号:密码
        encode_pass_name = base64.b64encode(proxy_name_pass)
        request.headers['Proxy-Authorization'] = 'Basic ' + encode_pass_name.decode()

编辑settings.py

DOWNLOADER_MIDDLEWARES = {
   # 'scrapyDemo.middlewares.ScrapydemoDownloaderMiddleware': 543,
   'scrapyDemo.middlewares.my_proxy': 543,
}

运行main.py  。如果有自定义的my_proxy就代表启动ip代理中间件成功了

 

user-agent中间件 反爬

继续编辑 middlewares.py

class my_useragent(object):
    def process_request(self,request,spider):
        USER_AGENT_LIST = [
            'MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23',
            'Opera/9.20 (Macintosh; Intel Mac OS X; U; en)',
            'Opera/9.0 (Macintosh; PPC Mac OS X; U; en)',
            'iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)',
            'Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)',
            'iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0',
            'Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)',
            'Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)'
        ]
        agent = random.choice(USER_AGENT_LIST)
        request.headers['User_Agent'] = agent

编辑 settings.py

DOWNLOADER_MIDDLEWARES = {
   # 'scrapyDemo.middlewares.ScrapydemoDownloaderMiddleware': 543,
   # 'scrapyDemo.middlewares.my_proxy': 543,
   'scrapyDemo.middlewares.my_useragent':543  # 可以和其他中间件同时生效,但是优先级不能一样
}

启动 main.py  , 这样就能成功爬取了

 

注意事项 

  • 中间件定义完要在settings文件内启用
  • 爬虫文件名和爬虫名称不能相同、spiders目录内不能存在相同爬虫名称的项目文件
  • 要做一个文明守法的好公民,不要爬取公民的隐私数据,不要给对方的系统带来不必要的麻烦
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Scrapy 爬虫入门: 爬取豆瓣电影top250 的相关文章

  • C/C++笔记-分析带有Q_OBJECT继承QObject的类make流程

    此篇博文记录到个笔记时间2023 02 15 xff0c 发表到网上的时间是2023 05 03 这里以Qt5 5 1为例 xff0c 操作系统是centos 7 5版本 代码如下 xff1a MOCQtConsole pro QT 43
  • C/C++笔记-构造makefile使用MOC程序及编译,链接

    背景是这样的构造一个Test类 xff0c 使用了Q OBJECT宏 xff0c 和继承了QObject xff0c 也就是元对象 xff0c 这时 xff0c makefile需要如何写 如下代码 xff1a Test h ifndef
  • C++20新特性个人总结

    目录 1 关键字 1 1 concept 1 2 requires 1 3 typename 1 4 explicit 1 5 constexpr 1 6 char8 t 1 7 consteval 1 8 co await co yiel
  • MySQL | MySQL为什么建议不要使用视图

    MySQL为什么建议不要使用视图 一 什么是视图二 为什么不建议使用视图 一 什么是视图 官方定义 xff1a 视图是指计算机数据库中的视图 xff0c 是一个虚拟表 xff0c 其内容由查询定义 同真实的表一样 xff0c 视图包含一系列
  • 【数据标准】学院数据集标准规范-1.6-元数据XML

    XML概述 XML 基础教育教学资源元数据的数据模型定义了一个层次结构的概念模型 xff0c 层次结构的模型可以方便地表示包含许多元素和子元素的数据 XML非常适合表示层次结构的模型 XML文档就是层次结构的 xff0c 它由元素组成 xf
  • Python-音频处理之wav文件与十进制pcm文件的相互转换

    一 pcm转wav 1 pcm文件以十进制的格式保存 xff0c 因此读取pcm的txt文件时不用 rb 来读取 2 适用于写单通道wav文件 xff0c 多通道需要对数据进行reshape操作 import wave import str
  • webapp打包为Android的apk包的一种方法

    开发了个纯web的app小demo 想着最终集成到微信公众号上做个小功能 xff0c 并测试下如何跨平台的运行在Android上 关于如何打包为Android的安装包 xff0c 总结了下其中的一种方法 xff0c 使用cordova打包为
  • 滤波算法(二)—— 中位值滤波算法

    1 算法介绍 中位值滤波算法的实现方法是采集N个周期的数据 xff0c 去掉N个周期数据中的最大值和最小值 xff0c 取剩下的数据的平均值 中位值滤波算法特别适用于会偶然出现异常值的系统 中位值滤波算法应用比较广泛 xff0c 比如用于一
  • C++可变参数使用总结

    可变参数是指函数可以接受不定数量的参数 比如在printf函数 xff0c 如果做日志等功能也会用到 这里总结下可变参数的使用 c语言中的可变参数 先介绍下在c语言中的使用 xff0c c语言也支持可变参数 xff0c 只是需要借助下va
  • 替代notepad++,notepad--介绍及插件cmake编译

    Notepad 43 43 是一个文本编辑器小软件 xff0c 用来替代windows自带的记事本 然而Notepad 43 43 软件的作者太霸道 xff0c 如果你不赞同他的观点 xff0c Notepad 43 43 将会在你的源码里
  • [环境搭建] onlyoffice环境搭建(docker-compose)

    只介绍环境搭建 不介绍集成 一 环境要求 内核 xff1a Linux 操作系统 xff1a centos 或者 ubuntu 容器环境 xff1a docker 容器镜像 xff1a onlyoffice documentserver 二
  • WSL:系统迁移【WSL默认安装在C盘,可以将虚拟机移到任意位置】

    因为虚拟机 xff08 Ubuntu22 04 xff09 默认安装在C盘 xff0c 大量占用系统盘的空间 xff0c 所以迁移到其他盘中 查看安装的虚拟机 wsl l v 关闭所有正在运行的虚拟机 wsl shutdown 对需要迁移的
  • Microsoft 365 Copilot怎么安装,如何下载?

    Microsoft 365 Copilot是一款基于人工智能的数字助手 xff0c 旨在帮助Microsoft 365商业版的用户更轻松地管理其工作流程 它可以提供实时反馈 自动生成报告 优化时间表以及自动化办公任务等功能 xff0c 这些
  • 关于Sublime Text4 _4126

    目录 前言 一 下载安装 下载安装 二 汉化 Install PackageChineseLocalzations 三 激活 进入hexed网站编辑编辑改码另存为 四 运行 successfully 总结 前言 怕以后忘了 xff0c 上操
  • CSDN编写技巧--CSDN中高亮显示代码

    介绍一种好的格式如下 xff1a 实现的方法就是以原代码的形式显示页面 xff0c 然后复制以下代码 xff1a lt div style 61 34 BORDER BOTTOM cccccc 1px dashed BORDER LEFT
  • 去掉jOSN中的转义符

    json返回全都是带 39 39 的 于是要去掉这个反斜杠 但是OC里面的 39 39 是转义符 不能直接用 64 34 34 之类的表示 一顿搜索之后 找到了OC对转义字符的表示方法 如下 a Sound alert b 退格 f For
  • 微软 Win11 一个命令安装 Windows Linux 子系统(WSL)

    在最新的 Windows 11操作系统中 xff0c 你只需运行 wsl exe install 就可以安装运行 WSL 所需的一切 使用 wsl install 微软表示 xff0c 以前设置 WSL 的过程过于复杂 xff0c 涉及到开
  • linux服务器xrdp远程链接密码对了却password failed解决方法

    linux服务器xrdp远程链接密码对了却password failed解决方法 遇到问题问题定位解决参考链接 遇到问题 在win10下用自带的远程连接登陆服务器 xff0c 明明密码对了 xff0c 却无法登陆 xff0c 显示 pass
  • 滤波算法(四)—— 卡尔曼滤波算法

    一 算法介绍 卡尔曼滤波是一个神奇的滤波算法 xff0c 应用非常广泛 xff0c 它是一种结合先验经验 测量更新的状态估计算法 1 状态估计 首先 xff0c 对于一个我们关心的物理量 xff0c 我们假设它符合下面的规律 其中 xff0
  • selenium-Firefox浏览器驱动geckodriver的下载配置

    首先下载Firefox的驱动 xff0c 地址 xff1a geckodriver Mirror 选择最新的版本 xff0c 进入后选择对应的系统下载 xff1a 将下载下来的文件放入到自己python的安装目录中的Scripts文件夹中即

随机推荐