[入门Python] 爬虫实例–爬取Baidu热搜新闻

目录

前言

库函数准备

数据爬取

网页爬取

数据解析

数据保存

数据可视化

Flask文件框架构建

程序编写

数据读取与封装

搭建HTML网页

调试并运行

总结

前言

何为爬虫,其实就是利用计算机模拟人对网页的操作

例如 模拟人类浏览购物网站 模拟人类进行 12306 购票

使用爬虫前一定要看目标网站可刑不可刑 :-)

可以在目标网站添加/robots.txt 查看网页具体信息

例如对天猫 可输入 https://brita.tmall.com/robots.txt 进行查看

[入门Python] 爬虫实例--爬取Baidu热搜新闻

User-agent 代表发送请求的对象

星号 *代表任何搜索引擎

Disallow 代表不允许访问的部分

/代表从根目录开始

Allow代表允许访问的部分

更多关于robots.txt文件细节可以自己去其他博主那里查看

在本例中 我爬取的百度热搜前30的新闻( 本人原本打算爬取英雄联盟主页 数据中心 大乱斗胜率前五十的英雄信息 奈何不会实现延时爬取网页的操作 无奈只能爬百度热搜) 并且其大致信息放到Excel表格以及Flask网页中实现数据可视化 感兴趣的同学也可以对其它内容进行爬取

Disallow的意思和高中不让带手机的规定是一个道理

由于本人水平有限 本文章中的爬虫都是比较基础的东西

库函数准备

Python库的安装方法:

  1. 打开cmd命令提示符
  2. 输入pip install XXX(这个是你要装的库名称)

关于这些库的具体使用 可以接下来看我的操作

只需要简单掌握几个常用的函数即可

bs4

即BeautifulSoup

用来解析HTML网页,提取指定数据的。

其中详细的用法待会看我的演示。

re

正则表达式 用来匹配字符串中响应的字串。

关于正则表达式 可以去看菜鸟教程 里边讲的很详细

正则表达式 – 教程 | 菜鸟教程 (runoob.com)

urllib

是一个Python自带的HTTP请求库,可以操作一系列URL。

xlwt/xlrt

用于写入(write) / 读取(read) Excel表中的数据。

flask

这个库是用来只做一个简单的Web框架即网站,用于数据的可视化。

其实本人对于数据可视化的掌握也很浅薄,只是简单的将数据导入Web网页中。

jinja2

这个库的作用是为了实现在HTML网页中的字符中插入自变量的功能。

后端:
name="HQ"
前端:
{{name}}长得真帅!
显示:
HQ长得真帅!

markupsafe

与Jinja共用 在渲染页面时用于避免不可信的输入,防止注入攻击(虽然没人会攻击你….)

数据爬取

数据爬取数据可视化 两个py文件是分开的

数据爬取需要导入re bs4 urllib xlwt 四个库文件

网页爬取

使用一下的方法调用函数可以使函数调用关系更加清晰

if __name__=="__main__":  #当程序执行时 调用一下函数
    main()

def askurl(url):
    head={
        "User-Agent":'''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
         AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'''
    }
    #用户代理 告诉服务器我只是一个普普通通的浏览器
    requset=urllib.request.Request(url)
    #发送请求
    response=urllib.request.urlopen(requset)
    #响应的为一个request对象
    #通过read()转化为 bytes类型字符串
    #再通过decode()转化为 str类型的字符串

    #接受响应
    html=response.read().decode('utf-8')

    将抓取到的网页存入文档中 方便观察
    path=r"C:\Users\XXX\Desktop\Python\text.txt"
    #这里在字符串前加入r 防止字符串中的\发生转义

    f=open(r"path",'w',encoding='utf-8')
    f.write(html)
    f.close()
    #这样在txt文件中就可以查看网页的源码

    return html

headers的值可以在网页中按F12

[入门Python] 爬虫实例--爬取Baidu热搜新闻

值得注意的是 请求中如果不设置headers 则服务器会返回一个418的状态码

代表服务器识别出来你是一个爬虫 并且表示:” I’m a teapot “

表明服务器拒绝冲煮咖啡,因为它永远是一个茶壶(这是一个梗)

数据解析

将抓取的txt文件后缀改为html后打开即为一个本地的网页

如果在 vscode中因为行过长而产生报错 可以参考以下博客

(149条消息) VS Code出于性能原因,对长行跳过令牌化。长行的长度可通过 “editor.maxTokenizationLineLength” 进行配置_小白的博客-CSDN博客_editor.maxtoken

打开后的网页如图所示

[入门Python] 爬虫实例--爬取Baidu热搜新闻

使用这个功能查看需要爬取信息的位置

在本项目中 我们抓取目标信息的标题 内容 热度 以及链接

[入门Python] 爬虫实例--爬取Baidu热搜新闻

[入门Python] 爬虫实例--爬取Baidu热搜新闻

于是我们用Beautifulsoup对网页进行解析

def getData(html):
    datalist=[]
    soup=BeautifulSoup(html,"html.parser")   #定义一个解析对象

    #soup.find_all(a,b) 其中a为标签的类型 class_ 对div的class进行匹配
    #返回的是所有class为category-wrap_iQLoo horizontal_1eKyQ的列表

    for item in soup.find_all('div',class_="category-wrap_iQLoo horizontal_1eKyQ"):
        item=str(item)
        #将列表中每一个子标签转换为字符串用于re匹配

有兴趣的同学可以打印soup或者item对象 观察一下是什么
这样就可以对匹配的原理有更深的理解!

接下来对每一个item进行re匹配

首先使用re.compile()创建匹配规则 然后用findall进行匹配

匹配规则的创建方式为在HTML文件中查看目标信息前后的特殊字符

而(.?)即为要匹配的字符串 其中后加?代表非贪婪匹配

例如

[入门Python] 爬虫实例--爬取Baidu热搜新闻

标题前后信息即为 ellipsis”>

其它同理

#匹配规则
#链接
findlink=re.compile(r' href="(.*?)" target="_blank')
#标题
findtitle=re.compile(r'ellipsis"> (.*?)   (.*?)  (.*?)  (.*?) ')

而内容部分 我在后续运行的时候发现报错 原因是

部分内容前缀为 ‘ellipsis_DupbZ”> 部分内容前缀为 small_Uvkd3″>

因此我编写了两种匹配方式

具体代码如下

def getData(html):
    datalist=[]
    soup=BeautifulSoup(html,"html.parser")   #定义一个解析对象

    #soup.find_all(a,b) 其中a为标签的类型 class_ 对div的class进行匹配
    #返回的是所有class为category-wrap_iQLoo horizontal_1eKyQ的列表

    for item in soup.find_all('div',class_="category-wrap_iQLoo horizontal_1eKyQ"):
        item=str(item)
        #将列表中每一个子标签转换为字符串用于re匹配
        data=[]
        #标题
        title=re.findall(findtitle,item)[0]
        #简介
        #判断是否对第一种匹配 如果不是的话返回为空列表 此时应采用第二种匹配

        if (len(re.findall(findcontent1,item))!=0):
            content=re.findall(findcontent1,item)[0]
        else:
            content=re.findall(findcontent2,item)[0]
        #热度
        number=re.findall(findnumber,item)[0]
        #链接
        link=re.findall(findlink,item)[0]

        #将数据存入数组
        data.append(title)
        data.append(number)
        data.append(content)
        data.append(link)
        datalist.append(data)

    print(datalist)
    return datalist

数据保存

def Savedata(datalist):
    #存入数据的目标路径
    path=r'C:\Users\XXX\Desktop\Python\爬虫\data.xls'
    workbook=xlwt.Workbook(encoding='utf-8')
    #创建工作表对象
    worksheet=workbook.add_sheet('sheet1')
    #创建表单
    col=("标题","热度","内容","链接")
    #定义表含有的属性

    for i in range(4):
        worksheet.write(0,i,col[i])
    #write(i,j,value) 向 表单的 [i][j] 位置写入value
    for i in range(30):
        for j in range(4):
            worksheet.write(i+1,j,datalist[i][j])
    #将excel表保存
    workbook.save(path)

数据可视化

Flask文件框架构建

首先创建一个flask文件夹 其中包含static和templates文件夹

(图中__pycache__为py运行过程中自动生成的文件 )

[入门Python] 爬虫实例--爬取Baidu热搜新闻

就是Flask最基本的文件类型

templates 和 static 文件夹是程序包的一部分,templates文件夹用于存储渲染的模板,static用来存储静态文件,如自定义CSS,图片等。

程序编写

其中的app,py文件则是编写脚本的py文件

py文件中 我们需要引入以下库函数

from flask import Flask,request
import xlrd
import jinja2
import markupsafe
from flask import render_template #render_template的作用一会再将

引入库函数后 我们编写的代码如下

app = Flask(__name__)
#实例化对象 __name__是系统变量 指本文件的名字--app

@app.route('/')
#路由解析  通过用户访问的路径  匹配响应的函数
#()内是要访问的路径

def index():
    datalist=[]#Excel读取到的数据存入该数组

    #读excel后存入datalist

    return render_template('index1.html',datalist=datalist)

render_template()函数返回一个渲染后的html网页
该函数传入其他参数 可以动态的向html网页中传参参数

其中的html网页即为templates中的网页

此时运行py文件即可访问templates中的html网页

[入门Python] 爬虫实例--爬取Baidu热搜新闻

如果在route中的路径为代码中所示

@app.route('/room')

def room():

    return render_template('room.html')

那么在构建的URL后+/room 即可访问room.html文件

[入门Python] 爬虫实例--爬取Baidu热搜新闻

数据读取与封装

再爬取数据的时候我们使用了 import xlwd向Excel中存入数据

接下来 我们使用 import xlrd来从Excel中读取我们刚刚保存的Excel表

datalist=[]
    #读excel文件
    book=xlrd.open_workbook(r'C:\XXX\data.xls')
    #读取表单
    sheet=book.sheets()[0]

    datalist=[]
    #利用循环将数据存入列表
    for i in range(1,30):
        mo=[]
        row=sheet.row(i)
        #sheet.row(i)返回第i行的每个格子中的内容 作为数组返回
        for j in row:
            mo.append(j.value)
        datalist.append(mo)
    return render_template('index1.html',datalist=datalist)
    #注意 我们把datalist=datalist作为参数引入index.html 这一点很重要

搭建HTML网页

接下来我们构建templates中的HTML文件


    !Baidu热搜!

        百度热搜!

                图片
                 标题
                 热度
                大致内容

            {% for data in datalist%}

                        {{data[0]}}

                 {{data[1]}}
                {{data[2]}}

            {% endfor %}

HTML文件的大致框架我是直接Ctrl C + Ctrl V 其它博主的

由于本人能力有限 不能做出来比较优美的前端网页 =。=

其中比较关键为 {{ data[x] }}这个在HTML中显示的为我们刚刚传入的data数组中的参数

而非字符 {{data[x]} 本身

类似于python中的s=”你好” print(s) 后输出为 “你好” 而不是 s

类似的 {%for i in m%} 就像python 中的for循环一样 迭代每个元素

{%end for%}标志着for循环的结尾

调试并运行

以上的工作完成后 我们就可以运行py文件

[入门Python] 爬虫实例--爬取Baidu热搜新闻

点击超链接进入我们搭建的网页

并查看爬取的新闻(某些新闻放上来会因为zz原因而不过审….)

[入门Python] 爬虫实例--爬取Baidu热搜新闻

大功告成!

总结

在编写的过程中 可以不停的print(对象) 或者print(type(对象))

查看返回的是什么东西

在网上积极查找相关函数的参数表和功能。

Original: https://blog.csdn.net/qq_58534264/article/details/122428162
Author: 「已注销」
Title: [入门Python] 爬虫实例–爬取Baidu热搜新闻

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733604/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关于多种验证码的应对方式

    爬虫程序会遇到各色各样的验证码,整理一下解决方法。 原理是根据像素平均值对比,来得到一串01010001这样的字符串,通过比较相同位置上是否相同。 统计出来的数量作为相似度凭据。 …

    Python 2023年10月31日
    048
  • 数据可视化 – Flask构建Web界面(一)

    数据可视化 – Flask构建Web界面(一) 1. 库的准备 from flask import Flask, render_template import sqli…

    Python 2023年8月12日
    0144
  • pygame库基础模块汇总

    1.安装 2.使用 3.display显示模块 4.draw模块 5.event模块 ① event可以判断的事件 ②键盘事件key 6.font模块 7.time模块 8.基本框…

    Python 2023年9月20日
    041
  • NV12等常用YUV数据格式

    NV12等常用YUV数据格式 1. YUV 采样表示法 2. YUV 格式 3. 数据格式 * 3.1 4:4:4 格式 3.2 4:2:2 格式 3.3 4:2:0 格式 4. …

    Python 2023年10月8日
    047
  • python-pandas用法大全

    目录 1 修改 DataFrame 某一列的数据类型 2 读取和保存 3 特定值的替换 4 两个 DataFrame 的连接 * 4.1 join 4.2 某列作为拼接的依据 5 …

    Python 2023年8月17日
    066
  • Scrapy爬取前程无忧

    一、确定爬取内容并创建mysql表 通过观察可以发现url为https://search.51job.com/list/000000,000000,0000,32,9,99,+,2…

    Python 2023年10月2日
    053
  • Python科学计算库

    一.Numpy 1.ndarray对象 python提供了array模块,它可以直接保存数值(而不是对象),但是它不支持多维数组,也缺乏丰富的运算函数 ndarray即n维数组,它…

    Python 2023年8月26日
    035
  • Python代码块及输入输出

    3.7 Python代码块及输入输出 分别引入了关键字和运算符,表达式由运算符和操作数组成。该语句由关键字、标识符和表达式组成。代码块由几个语句组成。 [En] The keywo…

    Python 2023年5月24日
    068
  • FastAPI-Amis-Admin: 一个拥有高性能,高效率,易拓展的fastapi管理后台框架

    项目介绍 FastAPI-Amis-Admin fastapi-amis-admin是一个拥有高性能,高效率,易拓展的fastapi管理后台框架启发自Django-Admin,并且…

    Python 2023年8月6日
    076
  • 实战讲解pandas中merge, join, concat的区别

    1.从一个需求说起 最近经常有这么一堆数据需要处理一下,而且是很常见的需求:有一个数据集,数据集里全是数字,需要对数据集按区间段进行个数统计,并计算各区间段的占比,所以本质上就是个…

    Python 2023年8月8日
    051
  • 一次性彻底讲透 Python 中 pd.concat 与 pd.merge

    数据的合并与关联是数据处理过程中经常遇到的问题,在SQL、HQL中大家可能都有用到 join、uion all 等 ,在 Pandas 中也有同样的功能,来满足数据处理需求,个人感…

    Python 2023年8月6日
    074
  • 【图像处理笔记】傅里叶变换

    【图像处理笔记】总目录 0 引言 在之前的博客 图像增强, 傅里叶变换(OpenCV)中都有用到过傅里叶变换,但一直都不是特别理解,现系统地学习一下。先来看一个视频 傅里叶级数与傅…

    Python 2023年10月13日
    049
  • python单选题考试题目大全

    在Python中要生成随机数,应该使用() A:math 模块B:random模块正确答案C:numpy 模块D:pygame 模块 关于函数的下列说法不正确的是: () A:函数…

    Python 2023年9月17日
    034
  • 带你体验给黑白照片上色

    摘要:借助人工智能技术,可以一定程度上帮助老照片还原原来色彩。还记得之前火热的”老北京视频上色”吗?就是采用类似的技术。 在智能手机越来越普及的今天,拍摄一…

    Python 2023年10月28日
    033
  • Scrapy入门

    Scrapy入门 Scrapy入门 了解scrapy 1.安装scrapy 2.创建项目 3.编写第一个爬虫 4.启动爬虫 重要概念 request对象 response对象 Sc…

    Python 2023年10月6日
    051
  • python和matlab互相调用之后,乱码问题

    win10:区域设置 – 其他日期、时间和区域设置 – 更改日期、时间或数字格式 – (跳出区域弹窗)管理 – 更改系统区域设置 &…

    Python 2023年6月12日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球