最全最简单scrapy框架搭建(附源码案例)

news2024/11/27 8:25:12

       最近在做项目中,需要网页的大批数据,查询数据是一项体力劳动,原本的我

 

  然而,奋斗了一天的我查到的数据却寥寥无几,后来的我是这样的

       作为一个cv工程师,复制粘贴原本是一件很快乐的事情但是它缺给了我无尽的折磨,所以我利用4天时间查询各种资料,翻阅各种视频,终于了解了一个面向监狱编程   -------   python爬虫

 在网上也没有明确的资料来介绍这方面的知识,所以我决定---------造福大众

        其实我刚开始用java实现爬虫操作,但是java爬虫复杂的操作,深深的打击了我,听说python爬虫不仅操作简单而且库非常强大,作为一个python零基础的我,毅然决然的去学习python爬虫,结果也在意料之中,有编程基础得我学习python还是相对而言还是比较容易的,所以怎么样才能搭建一个scrapy框架呢?思来想去我总结了两点:

  • 顺手的工具
  • 基础的爬虫知识

工具: Pycharm(一个基于python语言的开发工具),但是相对于我们这种业余选手来说,社区版的功能我觉得已经足够我们自己使用了(爬虫功能)

基础的爬虫知识: python库的使用以及xpath等解析的用法(如果有需要,后期会发详细的xpath解析介绍)

库的安装:在python下的Scripts下安装对应的库   可以使用国内的镜像进行下载

pip install 库名  -i http://pypi.douban.com/simple

上才艺:

如何才能创建一个属于你自己的网络爬虫

  

  •  创建爬虫文件(要在cmd控制面板进行操作)

 注意:项目的名字不允许使用数字开头,同时也不能包括中文字符

cd  项目的名字\项目的名字\spiders
scrapy genspider 爬虫的文件的名字  要爬取的网页(自动生成初始类)
  • 运行爬虫文件
scrapy crawl 爬虫文件
  • scrapy项目结构

项目的名字

​        项目的名字

​              spiders()(存储的是爬虫文件)

​                     init

​               init

​               items     定义数据结构的地方,定义爬取的数据的属性(字段)

​               middleware   中间件  代理

​               piplines  管道    用来处理下载的数据

​               settings   配置文件   中间含有爬虫遵守的规则(roots协议)   ua定义等
  • 常用方法
content = response.text     //转字符串
content = response.body     //二进制数据
response.extract()          //提取seletor对象的data的属性值
response.extract_first()    //提取seletor列表中的第一个数据
 html = requests.get(url=url, headers=headers).text     f = etree.HTML(html)   //使得网页可以被xpath进行解析

 一个完整的爬虫案例(爬取非遗官网公告信息)

 

lion.py

import urllib.request
import requests
import scrapy
from lxml import etree
from cultural.items import CulturalItem
import time
import schedule
from datetime import datetime
from Scheduler import Scheduler

#如果想要多页进行下载,需要先观察每页之间发送的url有什么规律,然后模拟服务器进行发送请求
class LionSpider(scrapy.Spider):
    name = "lion"
    #允许通过地址的规则
    allowed_domains = ["www.sxfycc.com"]
    start_urls = ["https://www.sxfycc.com/portal/qwfb/index.html"]
    base_urls = "https://www.sxfycc.com/portal/qwfb/index.html?page="
    page = 1

    def parse(self, response):
        li_list = response.xpath("//ul[@class='fabu_list_box']/li")
        for li in li_list:
            # 获取题目
            tltle = li.xpath(".//h2/strong/text()").extract_first()
            #获取照片
            npic = li.xpath(".//img/@src").extract_first()
            #获取内容
            content = li.xpath(".//p/text()").extract_first()
            # 二级页面
            url1 = li.xpath("./a/@href").extract_first()
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58",
                "Referer": "https://www.sxfycc.com/portal/qwfb/index.html",
                "sec-ch-ua": "\"Chromium\";v=\"112\", \"Microsoft Edge\";v=\"112\", \"Not:A-Brand\";v=\"99\"",
                "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\""
            }
            url = "https://www.sxfycc.com/" + str(url1)
            html = requests.get(url=url, headers=headers).text
            f = etree.HTML(html)
            contentone = f.xpath('//div[@class="news_xq"]//span/text()')
            cultural = CulturalItem(title=tltle, npic=npic, content=content, contentone=contentone)
             # 获取一个就将cultural对象交给管道
            yield cultural

        if self.page < 2:
            self.page = self.page + 1
            url = self.base_urls + str(self.page)
              # 怎么调用parse方法
              # scrapy.Request就是scrpay的get请求
              # callback你要执行的那个函数,不需要加圆括号
            yield scrapy.Request(url=url, callback=self.parse)

pipelines.py:

import urllib.request
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import datetime
import random
from scrapy.utils.project import get_project_settings
import pymysql


#这样写不必写一次管道开关一次,有利用节约内存资源
class CulturalPipeline:
    def open_spider(self, spider):
        self.fp = open('cultural.json', 'w', encoding='utf8')

    def process_item(self, item, spider):
        #'a' 可以对内容进行追加
        with open("cultural.json", "a", encoding='utf8') as fp:
            fp.write(str(item))

    def close_spider(self, spider):
        self.fp.close()


# 下载图片的管道
class FeistyPicturePipeline:
    def process_item(self, item, spider):
        url = item.get('npic')
        now = datetime.datetime.now()
        year = now.year
        month = now.month
        day = now.day
        hour = now.hour
        second = now.second
        reslut = str(year) + str(month) + str(day) + str(hour) + str(second) + str(random.randint(0, 10000))
        filename = './cultural/' + reslut + '.jpg'
        #通过url链接下载图片,并声明文件名字
        urllib.request.urlretrieve(url=url, filename=filename)
        return item


class MysqlPipeline:
    def open_spider(self, spider):
        settings = get_project_settings()
        self.host = settings['DB_host']
        self.port = settings['DB_PORT']
        self.user = settings['DB_USER']
        self.password = settings['DB_PASSWORD']
        self.name = settings['DB_NAME']
        self.charset = settings['DB_CHARSET']
        self.connect()

    def connect(self):
        self.conn = pymysql.connect(
            host=self.host,
            port=self.port,
            user=self.user,
            password=self.password,
            db=self.name,
            charset=self.charset
        )
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        contentone=str(item.get('contentone')).strip("['''']")
        sql = 'insert into cultural (title,content,npic,contentone,oper_time)values("{}","{}","{}","{}","{}")'.format(
            item['title'], item['content'], item['npic'],contentone, datetime.datetime.now())
        # 执行sql
        self.cursor.execute(sql)
        # 提交
        self.conn.commit()
        return item

    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()

settongs.py:

BOT_NAME = "cultural"

SPIDER_MODULES = ["cultural.spiders"]
NEWSPIDER_MODULE = "cultural.spiders"
#只在控制台打印错误的信息
LOG_LEVEL = 'WARNING'

#创建管道并声明优先级   
ITEM_PIPELINES = {
   "cultural.pipelines.CulturalPipeline": 300,
   "cultural.pipelines.FeistyPicturePipeline": 299,#优先级需要比CulturalPipeline低,不然会报错
   "cultural.pipelines.MysqlPipeline": 100#优先级需要比CulturalPipeline低,不然会报错
}

#声明与数据库的连接
DB_host = '127.0.0.1'    #ip地址
DB_PORT = 3306           #数据库端口号
DB_USER = 'root'         #数据库用户名
DB_PASSWORD = 'root'     #数据库密码
DB_NAME = "crawler"      #数据库库名
# utf-8不允许写           
DB_CHARSET = 'utf8'      #"utf-8"要写成'utf8',数据库不识别-

REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"

items.py:

import scrapy

class CulturalItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #声明与数据库相同的字段
    content = scrapy.Field()
    npic = scrapy.Field()
    title = scrapy.Field()
    contentone = scrapy.Field()

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

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

相关文章

【五一创作】[论文笔记]图片人群计数CSRNet,Switch-CNN

2018(有代码)_CSRNet (10次) 应用最最广泛的&#xff1a;e, is the most widely used while working with counting problems. 2018_CVPR——CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes https://arxiv.org/abs/1802.100…

[遗传学]近亲繁殖与杂种优势

目录 近交与杂交的遗传学效应 (1) 近交使基因纯和,杂交使基因杂合 近交效应: (2) 近交系数与亲缘系数 (3)运用通径分析方法计算近交系数和亲缘系数 ① 通径与通径链 ② 通径分析的理论及其应用 (4)近交降低群体基因型值的平均值,杂交提高群体均值 (5)近交使群体分化,杂…

mysql卸载及Ubuntu降级mysql并安装MySQL5.7并修改键盘失灵问题及 centos_x86.64安装MySQL5.7及修改密码及设置访问

卸载mysql 可以看centos_x86.64安装MySQL5.7标题的卸载 查看MySQL的依赖项 dpkg --list|grep mysql 卸载 mysql-common sudo apt remove mysql-common 卸载 mysql-server sudo apt autoremove --purge mysql-server 清除残留数据 dpkg -l|grep ^rc|awk ‘{print$2}’|sudo …

java.lang.NoSuchFieldException: TYPE

环境: IDEA 2022.1.4 SQL 2012 今日启动SpringBoot项目&#xff0c;出现 Initializing Spring embedded WebApplicationContext。 启动失败&#xff0c;我百度了下&#xff0c;说可能是下了断点&#xff0c;可我没有下断点。 2023-04-29 15:40:02.039 INFO 13676 --- [ …

Vue.js按键修饰符及v-model修饰符

目录 一、按键修饰符 &#xff08;1&#xff09;回车键按键修饰符示例 &#xff08;2&#xff09;自定义按键修饰符示例 二、v-model修饰符 &#xff08;1&#xff09;.lazy &#xff08;2&#xff09;.number &#xff08;3&#xff09;.trim 一、按键修饰符 v-on指令用…

【计算机图形学】三维图形投影和消隐(正等轴测投影图 消隐图构造)

模块4-2 三维图形投影和消隐 一 实验目的 编写三维图形各种变换的投影或消隐算法 二 实验内容 1&#xff1a;自行选择三维物体&#xff08;不能选长方体&#xff09;&#xff0c;建立坐标系&#xff0c;给定点的三维坐标值&#xff0c;建立边表结构&#xff0c;完成正等轴测…

【VM服务管家】VM4.x算法模块开发_4.2 联合OpenCV开发

目录 4.2.1 环境配置&#xff1a;使用OpenCV开发的环境配置4.2.2 图像类算法&#xff1a;使用OpenCV开发算法模块的方法 4.2.1 环境配置&#xff1a;使用OpenCV开发的环境配置 描述 环境&#xff1a;VM4.0.0及以上 VS2013 现象&#xff1a;使用第三方库OpenCV开发时&#xff…

记录-做一个文件拖动到文件夹的效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在我的电脑中&#xff0c;回想一下我们想要把一个文件拖动到另一个文件夹是什么样子的呢 1:鼠标抓起文件 2:拖动文件到文件夹上方 3:文件夹高亮&#xff0c;表示到达指定位置 4:松开鼠标将文件夹放入文…

ChatGPT能让智能客服更上一层楼么?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 现实生活中&#xff0c;智能客服的身影已随处可见。 随着全球经济从以产品为主向以服务为主转型&#xff0c;体验经济也快速发展。客户服务逐渐成为一个独立的产业&#xff0c;而客服中心也成为所有企业的基本部门。然而&am…

港科夜闻|香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)。沈向洋院士于2023年3月6日起担任香港科大校董会主席&#xff0c;这是他上任以后首次率队到访香港科大(广州)。这也标志着&#xff0c;两校将继续坚定不移地在“…

JavaEE——单例模式

文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前&#xff0c;我们得先明确一个名词设计模式。 所谓设计模式其实不难理解&#xff0c;就是在计算机这个圈子中&#xff0c;呢些大佬们为了…

驾考系统C#winform驾照考试系统

驾考系统C#winform驾照考试系统 c#&#xff0c;sqlite&#xff0c;winform &#xff0c;.net framwork4.0驾照考试系统 有兴趣的朋友可以修改源代码玩玩!我用的数据库是sqlite &#xff08;随着我国社会的不断进步和发展&#xff0c;越来越多的家庭拥有汽车&#xff0c;人们…

[linux-sd-webui]api之dreambooth训练

https://gitee.com/leeguandong/dreambooth-for-diffusionhttps://gitee.com/leeguandong/dreambooth-for-diffusionhttps://zhuanlan.zhihu.com/p/584736850https://zhuanlan.zhihu.com/p/584736850这个库使用的是diffusers库&#xff0c;现在主要就是kohya-ss/sd-scripts混合…

模拟退火算法与遗传算法求解多目标优化问题的算法实现(数学建模)

一、模拟退火算法 模拟退火算法是一种全局优化算法&#xff0c;解决的问题通常是找到一个最小化&#xff08;或最大化&#xff09;某个函数的全局最优解。它通过模拟物理退火的过程来搜索解空间&#xff0c;在开始时以一定的温度随机生成初始解&#xff0c;然后一步步降低温度…

java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏

画笔Graphics Java中提供了Graphics类&#xff0c;他是一个抽象的画笔&#xff0c;可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图。 Graphics常用的画图方法如下&#xff1a; drawLine(): 绘制直线drawString(): 绘制字符串drawRect(): 绘制矩形drawRoundRect(): 绘制…

YOLOv8——CV界的XGBoost

yolov8是ultralytics公司于2023年1月开源的anchor-free的最新目标检测算法框架。 封装在ultralytics这个库中&#xff1a;https://github.com/ultralytics/ultralytics 它具有以下优点&#xff1a; 1&#xff0c;性能速度领先&#xff1a;借鉴了之前许多YOLO版本的trick&#x…

spring常用的事务传播行为

事务传播行为介绍 Spring中的7个事务传播行为: 事务行为 说明 PROPAGATION_REQUIRED 支持当前事务&#xff0c;假设当前没有事务。就新建一个事务 PROPAGATION_SUPPORTS 支持当前事务&#xff0c;假设当前没有事务&#xff0c;就以非事务方式运行 PROPAGATION_MANDATORY…

ChatGPT能胜任高级程序员吗?

与开发人员信任的其他软件开发工具不同&#xff0c;AI工具在训练、构建、托管和使用方式等方面都存在一些独特的风险。 自2022年底ChatGPT发布以来&#xff0c;互联网上便充斥着对其几乎相同比例的支持和怀疑的论调。不管你是否喜欢它&#xff0c;AI正在逐步进入你的开发组织。…

JAVA ssm客户信息管理系统idea开发mysql数据库web结构计算机java编程springMVC

一、源码特点 idea ssm客户信息管理系统是一套完善的web设计系统mysql数据库springMVC框架mybatis&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开 发。 java ssm客户信息管理系统idea开发mysql数据…