python-Scrapy框架入门1111111111111

news2024/11/28 0:36:53

此网站爬取江南大学官网新闻信息
https://news.jiangnan.edu.cn/yw.htm

Scrapy安装

mac | Linux : pip install scrapy
windows:

  • pip install wheel
  • pip install pywin32
  • 安装Twisted : pip install Twisted_iocpsupport-1.0.2-cp310-cp310-win_amd64.whl
    (该文件去此网站下载,注意文件中的cp310代表python3.10版本。https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted)
  • pip install scrapy

安装完成后在此项目终端输入scrapy ,查看是否安装成功(不报错)

Scrapy工程创建

创建工程:scrapy startproject 文件名称
image.png

创建爬虫文件:scrapy genspider spiderName www.xxx.com

  • scrapy genspider 命令
  • spiderName 文件名称
  • www.xxx.com 爬取的网站 ,后面可以更改

执行后spiders中会多出一个文件,用来编写爬取规则
执行工程: scrapy crawl spiderName(指定执行的爬虫文件)

数据解析

Re

正则表达式,各语言差不多

bs4

  1. 安装

pip install bs4
pip install lxml

  1. 实例化

from bs4 import BeautifulSoup
本地实例化

  • fp = open(‘./txt.html’,‘r’,encoding=‘utf-8’)
  • soup = BeautifulSoup(fp,‘lxml’)

抓取网络页面

  • page_text = response.text
  • soup = BeautifulSoup(page_text,‘lxml’)
  1. 数据解析
  • soup.tagName
    • soup.tagName:返回的是文档中第一次出现的tagName对应的标签
  • soup.find()
    • soup.find(‘tagName’):等同于soup.div属性定位
    • soup,find(‘div’,class_/id/attr='song’soup.
    • find_all(‘tagName’):返回符合要求的所有标签 (列表)
  • select
    • select('某种选择器 (id,class,标签…选择器)),返回的是一个列表
    • 层级选择器:soup.select(.tang > ul > li > a’):>表示的是一个层级
    • soup.select( tang > ul a’): 空格表示的多个层级获取标签之间的文本数据
    • soup.a.text/string/get_text()
      • text/get text():可以获取某一个标签中所有的文本内容
      • string: 只可以获取该标签下的文本内容
  • 获取属性
    • soup.a[‘href’]

Xpath

  1. 实例化etree对象
  • pip install lxml

本地

  • etree.parse(filepath)

网络

  • etree.HTML(page_text)
  1. 解析
  • / 从根节点开始定位。表示的是一个层级
  • // 表示的是多个层级。
  • 属性定位: //div[@class=‘song’] 例:div[@class=‘song’]
  • 索引定位: div[@class=“song”]/p[3] 索引从1开始
  • 取文本:
    • /text() 标签中的直系文本内容
    • //text() 标签下的所有文本
  • 取属性
    • /@attrName img/@src

持久化存储

  1. 基于终端指令
  • parse函数return 要保存的数据
  • 执行文件时加入参数 scrapy crawl 文件名 -o filePath 注意文件格式,这里有限制
  1. 管道
  • items.py定义好保存的字段
class SchoolItem(scrapy.Item):
   
    school = scrapy.Field()
    Time = scrapy.Field()
    Col = scrapy.Field()
    Title = scrapy.Field()
    Text = scrapy.Field()
    Provenance = scrapy.Field()
    URL = scrapy.Field()
    FWLCount = scrapy.Field()
    Heat = scrapy.Field()

  • spider中 def parse 函数中将数据保存
item = SchoolItem()
item["school"] = "江南大学"
item["Col"] = "综合新闻"
item["Heat"] = random.randint(500, 1000)
item["FWLCount"] = random.randint(100, 2000)

item["Time"] = data
item["URL"] = handle_url
item["Title"] = title
item["Text"] = content
item["Provenance"] = source
yield item
  1. setting.py 开启管道
ITEM_PIPELINES = {
  # 数值表示管道的权重  小的靠前
   "school.pipelines.SchoolPipeline": 300,    
}
  1. 编写管道规则
class SchoolPipeline:

    conn = None
    cursor = None
    new_Num = 0
    def open_spider(self,spider):
        print("网站信息开始收集...")
        self.conn = pymysql.Connect(
            user='root',
            password='root',
            host='localhost',
            port=3306,
            database='yu'
        )

    def process_item(self, item, spider):

        self.cursor = self.conn.cursor()
        try:
            query = "insert into app01_schoolnews values ('%s','%s','%s','%s','%s','%s','%s','%s','%s')"
            values = (
            item['school'], item['Time'], item['Col'], item['Title'], item['Text'],item['URL'],item['Provenance'], item['Heat'],
            item['FWLCount'])
            QUERY = format(query%values)
            # print(QUERY)
            self.cursor.execute(QUERY)
            self.conn.commit()
            print("插入数据库成功...")
            self.new_Num += 1
        except Exception as e:
            print("mysql连接异常...",e)
        # return item

    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()
        print("关闭数据库连接。共入库%d条数据..."%self.new_Num)

表模型

CREATE TABLE `app01_schoolnews` (
  `school` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `Time` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `Col` longtext COLLATE utf8mb4_general_ci NOT NULL,
  `Title` longtext COLLATE utf8mb4_general_ci NOT NULL,
  `Text` longtext COLLATE utf8mb4_general_ci NOT NULL,
  `Provenance` longtext COLLATE utf8mb4_general_ci NOT NULL,
  `URL` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `FWLCount` int NOT NULL,
  `Heat` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

gitee地址:https://gitee.com/xiongjinwang/python

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

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

相关文章

使用Nginx或者Fiddler快速代理调试

1 背景问题 在分析业务系统程序问题时,存在服务系统环境是其它部门或者其它小组搭建或运维的,并且现在微服务时代,服务多且复杂,在个人机器上搭建起如此环境,要么费事费力,要么不具备充足条件。 急需有一种方法或者工具可以快速辅助调试定位分析问题。本文下面介绍代理方…

算法沉淀——多源 BFS(leetcode真题剖析)

算法沉淀——多源 BFS(leetcode真题剖析) 01.矩阵02.飞地的数量03.地图中的最高点04.地图分析 多源 BFS 是指从多个源点同时进行广度优先搜索的算法。在传统的 BFS 中,我们通常从一个起始点开始,逐层遍历所有的相邻节点。而在多…

IDEA-常用插件

1、Mybatis Log Free 当我们使用mybatis log在控制台输出sql 内容,输出内容将语句与参数分开打印,还需要手动将参数替换到指定位置。 使用对应插件后,自动将输出内容组装成完整的可直接执行的SQL 在插件市场 查看对应名称,并安装。…

KMPC++(Acwing)

代码&#xff1a; #include <iostream>using namespace std;const int N 100010, M 1000010;int n, m; int ne[N]; char s[M], p[N];int main() {cin >> n >> p 1 >> m >> s 1;for (int i 2, j 0; i < n; i ){while (j && p[…

Academic Inquiry|投稿状态分享(ACS,Wiley,RSC,Elsevier,MDPI,Springer Nature出版社)

作为科研人员&#xff0c;我们经常会面临着向学术期刊投稿的问题。一般来说&#xff0c;期刊的投稿状态会在官方网站上进行公示&#xff0c;我们可以通过期刊的官方网站或者投稿系统查询到我们投稿的论文的状态&#xff0c;对于不同的期刊在投稿系统中会有不同的显示。 说明&am…

APP广告变现有哪些途径?哪种变现效果好?

无论哪种类型的APP都可以通过接入广告实现商业化变现&#xff0c;作为互联网广告载体的APP&#xff0c;比线下传统广告位更具有优势&#xff0c;不受地域限制&#xff0c;可以让广告的覆盖面更广。通过丰富的广告形式&#xff0c;精准的目标用户的画像&#xff0c;可以更好实现…

lazada、速卖通卖家如何掌握自养号测评技巧打造高评价产品?

做跨境电商卖家都知道&#xff0c;国外的买家购物比较理性&#xff0c;也喜欢货比三家&#xff0c;所以店铺想要留住客户&#xff0c;就需要一些优质的产品来吸引他们。产品评价是卖家获取买家信任的重要途径&#xff0c;评价越高的产品&#xff0c;销量也就越好。 尤其是 Shop…

ClickHouse监控及备份

第1章 ClickHouse监控概述 第2章 Prometheus&Grafana的安装 第3章 ClickHouse配置 第4章 Grafana集成Prometheus 第5章 备份及恢复

佳能2580的下载手册

凡是和电子产品有关的产品其内部都开始不断地进行内卷&#xff0c;在不断地内卷背后&#xff0c;意味着科技更新和换代&#xff0c;自己也入手了一台佳能2580的打印机&#xff0c;一台相对比较老式的打印机&#xff0c;以此不断地自己想要进行打印的需要。 下载的基础步骤&…

应急响应实战笔记02日志分析篇(5)

第5篇:MySQL日志分析 常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析&#xff0c;可以发现攻击行为&#xff0c;进一步还原攻击场景及追溯攻击源。 0x01 Mysql日志分析 general query log能记录成功连接和每次执行的查询&#xff0c;我们…

【算法】基础算法002之滑动窗口(二)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 5.水果成篮&#xff…

jq 图片懒加载 + Vue-Lazyload

jq原生 图片 懒加载 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compati…

《2024巨量引擎日化行业白皮书》丨附下载

✦ ✦✦ ✦✦ ✦✦ ✦ 中国日化行业在2022年短暂承压之后&#xff0c;随着生活恢复常态&#xff0c;迎来新的发展契机&#xff0c;2023年呈回稳向上态势。以抖音为代表的内容电商是行业增长的主要驱动力&#xff0c;内容场和货架场互通互联&#xff0c;促进行业全域化释放潜能…

从零开始手写mmo游戏从框架到爆炸(十二)— 角色设定

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 写了这么多的框架&#xff0c;说好的mmo游戏呢&#xff1f;所以我们暂时按下框架不表&#xff0c;这几篇我们设计英雄角色、怪物、技能和地图。本篇我们来对游戏角色…

解决Webstorm2023使用账号连接GitLab的问题personal access token instead of a password

问题 升级Webstorm之后&#xff0c;发现gitlab仓库拉取代码报错 报错信息 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https…

Docker Desktop 链接windos 安装的redis和mysql

1.1.先在容器安装项目 2.链接redis和mysql配置 redis和mysql是在windos安装的&#xff0c;使用的是小p管理器安装的 项目链接 DB_DRIVERmysql DB_HOSThost.docker.internal DB_PORT3306 DB_DATABASEyunxc_test DB_USERNAMEyunxc_test DB_PASSWORDtest123456... DB_CHARSETutf…

java.sql.SQLException: No operations allowed after statement closed.

背景 某天下午&#xff0c;客服反馈线上服务出现问题&#xff0c;不能分配了。于是我登录到系统上&#xff0c;进行同样的操作发现也不行。当然同时我已经登录到服务器打开了日志&#xff0c;发现报错了&#xff0c;下面就是日志的错误信息&#xff1a; java.sql.SQLExceptio…

【开源】JAVA+Vue.js实现农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

Java入门基础语法

文章目录 3.1 字面量3.2 数据类型3.3 变量3.4 变量的案例3.4.1 手机信息描述3.4.2 疫情防控信息采集表 3.5 变量的注意事项3.6 关键字3.7 标识符 来学习 Java 基础语法部分的知识&#xff0c;这些内容是我们后面编写程序的基本功&#xff0c;所以呢&#xff0c;得好好学习&…

C/C++数据结构——剖析排序算法

1. 排序的概念及其运用 1.1 排序的概念 https://en.wikipedia.org/wiki/Insertion_sorthttps://en.wikipedia.org/wiki/Insertion_sort 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…