【数据采集】获取网站数据(二)

2023-10-30

获取网站数据(二)

1.常用的数据采集python库

Beautiful Soup:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
pyspider:http://docs.pyspider.org/en/latest/
Scrapy:https://scrapy-chs.readthedocs.io/zh_CN/0.24/#
selenium:https://selenium-python-zh.readthedocs.io/en/latest/

2.实例

中传要闻 为例,获取相关的新闻信息(新闻标题、新闻链接、新闻来源、发布日期、浏览量、新闻内容、图片链接),并存入数据库中。

本文代码已放在我的GitHub上,需要的朋友可以自行获取。
https://github.com/Beracle/07-public-opinion-analysis/blob/main/cuc_news_all.ipynb

导入需要的包。

import requests
import re
import pymysql
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

函数 savenews() 用来将采集的数据存入数据库中。

def savenews(title,url,department,publishdate,count,content,piclinks):
    #pysql.connect(数据库URL,用户名,密码,数据库名)
    db = pymysql.connect("localhost","root","密码","数据库名",charset="utf8")
    cursor = db.cursor()
    try:
        cursor.execute('INSERT INTO cucnews(title,url,department,publishdate,count,content,piclinks) VALUES(%s,%s,%s,%s,%s,%s,%s)', (title,url,department,publishdate,count,content,piclinks))
        db.commit()
    except:
        print('数据库连接错误!')
        db.rollback()
    db.close()

函数 parsecontent() 用来解析某个特定网页,网址由 newsurl 参数传入。最后的返回值包括:新闻发布部门、新闻发布日期、浏览量、新闻中包含的所有图片链接、新闻内容。

def parsecontent(newsurl):
    try:
        option = webdriver.ChromeOptions()
        option.add_argument('headless') # 设置不打开浏览器
        # executable_path是谷歌浏览器的驱动路径,请确保已安装
        bro = webdriver.Chrome(options = option,executable_path=r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
        bro.get(newsurl)
        html_source = bro.page_source
        soup = bs(html_source,"html.parser")
        
        #新闻标题
        h1 = soup.find_all("h1")
        
        info = soup.find_all("span",attrs={"class":"arti-name"})
        infotxt = info[0].get_text()       
        department = infotxt[infotxt.find('来源:')+3:infotxt.find('20')] #发表部门
        newsdate = infotxt[infotxt.find('20'):infotxt.find('20')+10] #发表日期
        r = re.compile('[\u4e00-\u9fa5]+')
        dep = r.findall(department)
        
        countinfo = soup.find_all("span",attrs={"class":"WP_VisitCount"})
        count = countinfo[0].get_text()
        
        all_image = soup.find("article",attrs={"class":"con-area"}).find_all('img')
        piclinks = ''
        for i in range(len(all_image)):
            if all_image[i] != '':
                link = 'http://www.cuc.edu.cn/_upload/'+str(all_image[i])[str(all_image[i]).find('src="')+14:str(all_image[i]).find('.')+4]
                piclinks = piclinks + link + ' '
        
        contentinfo = soup.find_all("div",attrs={"class":"wp_articlecontent"})
        content = contentinfo[0].get_text()
        
        bro.quit()
    except:
        print('data-error')
    
    return dep[0],newsdate,count,piclinks,content

为什么上面的代码要用到 selenium.webdriver(),按照下面这么写不就好了。

url = 'http://www.cuc.edu.cn/news/2021/0311/c1901a178638/page.htm'
r=requests.get(url)
code=r.encoding
content=r.content
rt=str(content,"utf-8")
soup=bs(rt,"html.parser")
print(soup)

在这里插入图片描述
观察实际输出,我们发现显示的浏览量和实际的浏览量并不一致。

这里简单解释一下。浏览器的右键“查看源代码”看到的是网页文件最原始的代码,没有经过js运算;F12查看到的开发者工具中的html代码,是经过js运算过的代码。浏览器在接收完html后才执行js代码。因而如果是服务器端脚本,“查看源代码”是服务器端生成的html,还没经过js运算。

看一下使用 selenium.webdriver 的运行结果。

url = 'http://www.cuc.edu.cn/news/2021/0311/c1901a178638/page.htm'
option = webdriver.ChromeOptions()
option.add_argument('headless')
bro = webdriver.Chrome(options = option,executable_path=r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
bro.get(url)
html_source = bro.page_source
soup = bs(html_source,"html.parser")
print(soup)

在这里插入图片描述

测试一下 parsecontent() 函数。

parsecontent("http://www.cuc.edu.cn/news/2021/0311/c1901a178638/page.htm")

在这里插入图片描述
对于每一条新闻的url调用parsecontent()函数,再调用savenew()函数将每条新闻的相关信息存入数据库。

urlpath="http://www.cuc.edu.cn/news/1901/list"
try:
    for i in range(1,4):
        url=urlpath+str(i)+".htm"
        #print(url)
        r=requests.get(url)
        code=r.encoding
        content=r.content
        rt=str(content,"utf-8")
        soup=bs(rt,"html.parser")
        href=soup.find_all("h3",attrs={'class','tit'})
        for h in href:
            newsurl=h.find_all('a')
            urllen=str(newsurl[0]).find('target')
            newsurl=str(newsurl[0])[9:urllen-2]
            newsurl="http://www.cuc.edu.cn"+newsurl
            title=h.get_text()
            print(title) 
            print("------Save Start!---------")
            department,date,count,piclinks,content = parsecontent(newsurl)
            savenews(title,newsurl,department,date,count,content,piclinks)
            print("------Save Sucess!---------")
            #savenews(title,newsurl)
except:
    print("Error!")

在这里插入图片描述
在这里插入图片描述
可以看到,数据已被成功存入数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据采集】获取网站数据(二) 的相关文章

  • 【数据分析】基于RFM模型的线上零售中的客户细分(二):RFM模型实战

    基于RFM模型的线上零售中的客户细分 二 摘要 在上一篇博客 基于RFM模型的线上零售中的客户细分 一 客户细分 中 我们了解了什么是客户细分 这篇博客将会结合具体的商业实例介绍同期群分析 RFM模型 并利用K Means聚类算法在RFM模
  • 【数据分析】初识 AB 测试

    初识 AB 测试 1 简述 AB 测试 AB 测试是指为了评估模型 项目的效果 在 APP PC 端同时设计多个版本 在同一时间维度下 分别让组成成分相同 相似 的访客群组随机访问这些版本 收集各群组的用户体验数据和业务数据 最后分析评估出
  • 【数据分析】数据分析方法(二):逻辑树分析方法

    数据分析方法 二 逻辑树分析方法 逻辑树分析方法是把复杂问题拆解成若干个简单的子问题 然后像树枝那样逐步展开 1 工作计划分解 不管是在实际生活中还是工作中 我们经常会使用逻辑树分析方法来分析问题 比如 现在你想给自己做一个年度计划 但是要
  • 收藏!关于数据科学中数学和统计学的完全指南

    全文共6409字 预计学习时长19分钟 图源 Unsplash 数据科学家是程序员中最擅长统计学 统计学家中最擅长编程的人 乔什 威尔斯 Josh Wills 数学很重要 数学与我们周围的一切事物息息相关 从形状 图案 颜色到花朵中花瓣的数
  • 数据科学编程技能

    特点 使用数据科学技术 您可以将原始数据转化为可操作的见解 适用于从城市规划到精准医学的各个领域 数据科学编程技能汇集了您入门所需的所有基础技能 即使您没有编程或数据科学经验 指导安装和配置解决专业级数据科学问题所需的工具 包括广泛使用的
  • 时间序列分析教程(二):移动平均与指数平滑

    之前介绍了时间序列的基本概念和性质 现在就正式介绍一些处理时间序列的模型方法 第一个是移动平均法 移动平均法很简单 就是用最近的数据预测未来短时间内的数据 有简单移动平均法 真的很简单 就是用最近的一组数据 去平均 作为下一时刻的预测 S
  • 【用户增长】找到用户增长的根本动因

    找到用户增长的根本动因 1 没有痛点的用户增长是不持久的 近几年创业的人越来越多 在这些创业失败的案例中 不乏一些 UI 设计非常漂亮的产品 但最终却因为用户增长做不起来而导致创业失败 这些产品失败的最主要原因就是没有找对痛点 没有需求也就
  • 【数据科学】肯德尔等级相关系数( Kendall's tau coefficient )

    在统计学中 Kendall等级相关系数 通常称为Kendall的tau系数 在希腊字母 之后 是用于测量两个测量量之间的序数关联的统计量 甲tau蛋白测试是一种非参数假设检验用于基于所述tau蛋白系数统计依赖性 它是衡量等级相关 数据的排序
  • R语言编程 R语言作业

    一 40 分 请使用 nycflight13 回答以下问题 1 请用 flights 表单找出出发时间没有延误 但是到达时间的所有航班 2 在 1 数据的基础上计算到达每个目的地的航班数量 平均飞行距离和平 均到达延误时间 3 在 2 的基
  • 时间序列分析-电视广告呼入次数预测

    案例 电视广告呼入次数预测 import pandas as pd import numpy as np np random seed 1206 import matplotlib pyplot as plt matplotlib inli
  • 【数据异常校验】肖维勒准则(Chauvenet Criterion)处理异常数据

    介绍 在统计理论中 肖维勒准则 以William Chauvenet命名 是评估一组实验数据 一组异常值 是否可能是虚假的一种手段 肖维勒准则背后的想法是找到一个以正态分布的均值为中心的概率带 它应该合理地包含数据集的所有n个样本 通过这样
  • 【数据分析】数据分析方法(四):多维度拆解分析 & 对比分析

    数据分析方法 四 多维度拆解分析 对比分析 1 多维度拆解分析方法 对于多维度拆解分析方法 要理解两个关键词 维度 拆解 只看数据整体 我们可能注意不到数据内部各个部分构成的差异 如果忽略这种差异进行比较 就有可能导致无法察觉该差异所造成的
  • 【数据分析】为什么要学习分析方法?

    为什么要学习分析方法 如果你有以下这些症状 没有数据分析意识 工作由拍脑袋决定 而不是靠数据分析来支持决策 统计时的数据分析 做了很多图表 却发现不了业务中存在的问题 只会使用工具的数据分析 谈起使用工具的技巧头头是道 但是面对问题 还是不
  • R和Python概率分布统计和Python验证独立性和平稳性时间序列

    R概率分布和统计 R 基础知识 汇总统计数据 图形显示 概率基础知识 概率规则 条件概率 后验概率和贝叶斯 可靠性 离散分布介绍 几何分布 概率密度函数 概率密度函数 pdf 定义为 P X x
  • Pandas 中DataFrame的groupby()计数、groupby()取样及reset_index()的使用

    什么是groupby 以下为对DataFrame对象按A进行分组操作 图片来源 内容 目的 DataFrame对象按照指定列 LNG LAT 分组计数 并将分组计数结果 包括指定列及计数值 写入csv文件中 过程 代码一 import pa
  • 推荐一个冷门又逆天的副业:Python兼职可月入10k+,成年人的世界,钱才是底气

    关于穷 去年有了一个更学术的说法 隐形贫困人口 就是因为有太多 种草达人 让我们为了物质生活超前消费 再加上不理财的话 那简直是雪上加霜 看到知乎上面最近有一个很火的问题 90后的你 现在拥有多少存款 你会看到人生百态 有人父母双亡 白手起
  • 【数据分析】利用机器学习算法进行预测分析(二):线性回归(Linear Regression)

    时间序列预测中的机器学习方法 二 线性回归 Linear Regression 本文是 时间序列预测中的机器学习方法 系列文章的第二篇 如果您有兴趣 可以先阅读前面的文章 数据分析 利用机器学习算法进行预测分析 一 移动平均 Moving
  • 如何成长为一名机器学习工程师

    如何成长为一名机器学习工程师 经常有人这么问 而这篇文章就尝试回答这个问题 其中会谈到关于机器学习的方方面面 从简单的线性回归到最新的神经网络 你不仅将学习如何使用这些技术 还将学习如何从头开始构建它们 这个指南主要面向计算机视觉 CV 这
  • Python Matplotlib库:统计图补充

    作者简介 人工智能专业本科在读 喜欢计算机与编程 写博客记录自己的学习历程 个人主页 小嗷犬的博客 个人信条 为天地立心 为生民立命 为往圣继绝学 为万世开太平 本文内容 Python Matplotlib库 统计图补充 Python Ma
  • 【数据分析】业务指标的几个相关思考

    业务指标的几个相关思考 1 如何理解数据 拿到数据后 第一步 弄清楚数据里每一列的含义 第二步 对数据进行分类 有助于后期的分析 通常将数据分为 用户数据 行为数据 产品数据 三类 用户数据 指的是用户的基本情况 包括姓名 性别 邮箱 年龄

随机推荐

  • Linux性能优化实战CPU篇之软中断(三)

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475目录 一 软中断
  • msvcr120.dll丢失怎样修复,学这三招就可以修复好

    年前才买的新电脑 今天在打开软件ps软件的时候 电脑就提升msvcr120 dll文件丢失 无法执行此代码 刚刚开始以为是电脑的系统没有装好 经过我一下午时间的研究 原来是电脑msvcr120 dll文件丢失一般都是下载到垃圾软件 导致ms
  • Linux 临时增加环境变量

    增加环境变量 export name value 改变PATH环境变量 export PATH value PATH 这种方法只能临时增加环境变量 关闭shell窗口再打开就失效
  • 如何制作启动盘U盘(纯净版无捆绑)

    如何制作启动盘U盘 纯净版无捆绑 第一步 进入网站下载最新的镜像文件 网站地址 https msdn itellyou cn 如图所示 找到需要下载的展开详细信息 把链接复制下来 打开迅雷软件 会弹出下载链接界面 第二步 下载 rufus
  • CAS和多线程密切相关的东西!

    compare and swap 寄存器A的值和内存M的值进行比较 如果值相同 就把寄存器B和M的值进行交换 更多的时候 不关心寄存器中的数量是啥 更关心内存的数值 变量的值 CAS相当于是把开了新世界的大门 让咱们不加锁就能保证线程安全
  • Linux 搭建 MariaDB Galera Cluster 高可用集群

    MariaDB Galera Cluster 集群介绍 MariaDB Galera Cluster 下文简称MGC集群 是一套在MySQL innodb存储引擎上面实现多主 数据实时同步以及强一致性的关系存储架构 业务层面无需做读写分离工
  • rtklib中的基线约束应对观测条件糟糕的GNSS数据

    文章目录 问题 观测数据质量很差 使用基线约束后和约束前的结果对比 基线约束的原理 问题 观测数据质量很差 最近遇到一个难题 采集了500小时的数据 可是只有大约50 的的数据可以解算 呃 基线长度大约5公里 也算不上长基线 对这批数据进行
  • 串的模式匹配算法-BF算法+KMP算法

    BF算法 include
  • Spring Boot 中的 KafkaTemplate 是什么,原理,如何使用

    Spring Boot 中的 KafkaTemplate 是什么 原理 如何使用 Kafka 是一个流行的分布式消息系统 它可以用于在应用程序之间传递消息 Spring Boot 提供了对 Kafka 的支持 我们可以使用 Spring B
  • org.springframework.beans.factory.UnsatisfiedDependencyException异常问题的解决

    最近学了IDEA和SpringBoot MyBatis了 正所谓学以致用 于是用所学的来做项目 单元测试时报了下面的异常 Caused by org springframework beans factory UnsatisfiedDepe
  • WPF 在XAML中通过控件事件改变另一控件属性

    使用WPF进行开发 很多时候是要注意UI和后台代码的分离 尤其是要改变WinForm中的事件驱动机制 可是近期的开发遇到了这样一个问题 就是当一个控件的事件触发时 改变同级别的另一控件的属性 文字能力实在单薄 还是通过具体例子来说吧 首先
  • 深度学习训练模型的硬件条件

    之前热衷于学习理论知识 目前想跑代码了发现不知道从何下手 自己电脑上搭建的平台基本就是个摆设 因为跑不起来呀 今天我们就来看看想做深度学习应该怎么下手 首先了解下基础知识 1 深度学习用cpu训练和用gpu训练的区别 1 CPU主要用于串行
  • linux 上运行jxbrower出现的问题

    最近做了一个jxbrower抓取微信公众号文章的程序 想着挂在linux上定时运行 布上去却有几个问题这边总结一下 我得服务器是ubuntu16版本的 1 在linux无桌面的版本运行需要用x server运行 2 就是linux的Chro
  • L2-1 包装机PTA

    一种自动包装机的结构如图 1 所示 首先机器中有 N 条轨道 放置了一些物品 轨道下面有一个筐 当某条轨道的按钮被按下时 活塞向左推动 将轨道尽头的一件物品推落筐中 当 0 号按钮被按下时 机械手将抓取筐顶部的一件物品 放到流水线上 图 2
  • qt中drawline函数的参数_Qt--基础图形绘制

    一 基础图形绘制 A Qt图形系统中的关键角色 QPainter Qt中的画家 能够绘制各种基础图形 拥有绘图所需的画笔 画刷 字体 QPaintDevice Qt中的画布 画家的绘图板 所有的QWidget类都继承自QPaintDevic
  • (小白学java)Java 循环结构

    Java中有三种主要的循环结构 while 循环 do while 循环 for 循环 while 循环 和c很像了 不多写了 public class demo public static void main String args in
  • Javascript设计模式-10-迭代器模式

    Javascript设计模式 10 迭代器模式 简介 提供一种方法 顺序访问一个聚合对象中各个元素 而又不需要暴露该方法中的内部表示 迭代器模式可以把迭代的过程从业务逻辑中分离出来 在使用迭代器模式之后 即使不关心对象的内部构造 也可以按顺
  • 个人养老话题

    中国家庭的财富保卫战有三大战场 1 生娃 2 买都市圈里的好房子 3 买好股 好基
  • 【RSA】RSA加密、解密、签名与验证

    前言 最近要做iOS SDK的联网授权 涉及到数据安全验证 因此想到使用RSA进行签名和验证 授权主要流程如下 1 客户方前往我方开放平台注册授权 得到AppId和AppSecret 2 客户方集成SDK 调用Register接口传入App
  • 【数据采集】获取网站数据(二)

    获取网站数据 二 1 常用的数据采集python库 Beautiful Soup https www crummy com software BeautifulSoup bs4 doc zh pyspider http docs pyspi