目录
前言
何为爬虫,其实就是利用计算机模拟人对网页的操作
例如 模拟人类浏览购物网站 模拟人类进行 12306 购票
使用爬虫前一定要看目标网站可刑不可刑 :-)
可以在目标网站添加/robots.txt 查看网页具体信息
例如对天猫 可输入 https://brita.tmall.com/robots.txt 进行查看
User-agent 代表发送请求的对象
星号 *代表任何搜索引擎
Disallow 代表不允许访问的部分
/代表从根目录开始
Allow代表允许访问的部分
更多关于robots.txt文件细节可以自己去其他博主那里查看
在本例中 我爬取的百度热搜前30的新闻( 本人原本打算爬取英雄联盟主页 数据中心 大乱斗胜率前五十的英雄信息 奈何不会实现延时爬取网页的操作 无奈只能爬百度热搜) 并且其大致信息放到Excel表格以及Flask网页中实现数据可视化 感兴趣的同学也可以对其它内容进行爬取
Disallow的意思和高中不让带手机的规定是一个道理
由于本人水平有限 本文章中的爬虫都是比较基础的东西
库函数准备
Python库的安装方法:
- 打开cmd命令提示符
- 输入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
值得注意的是 请求中如果不设置headers 则服务器会返回一个418的状态码
代表服务器识别出来你是一个爬虫 并且表示:” I’m a teapot “
表明服务器拒绝冲煮咖啡,因为它永远是一个茶壶(这是一个梗)
数据解析
将抓取的txt文件后缀改为html后打开即为一个本地的网页
如果在 vscode中因为行过长而产生报错 可以参考以下博客
打开后的网页如图所示
使用这个功能查看需要爬取信息的位置
在本项目中 我们抓取目标信息的标题 内容 热度 以及链接
于是我们用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文件中查看目标信息前后的特殊字符
而(.?)即为要匹配的字符串 其中后加?代表非贪婪匹配
例如
标题前后信息即为 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运行过程中自动生成的文件 )
就是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网页
如果在route中的路径为代码中所示
@app.route('/room')
def room():
return render_template('room.html')
那么在构建的URL后+/room 即可访问room.html文件
数据读取与封装
再爬取数据的时候我们使用了 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文件
点击超链接进入我们搭建的网页
并查看爬取的新闻(某些新闻放上来会因为zz原因而不过审….)
大功告成!
总结
在编写的过程中 可以不停的print(对象) 或者print(type(对象))
查看返回的是什么东西
在网上积极查找相关函数的参数表和功能。
Original: https://blog.csdn.net/qq_58534264/article/details/122428162
Author: 「已注销」
Title: [入门Python] 爬虫实例–爬取Baidu热搜新闻
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733604/
转载文章受原作者版权保护。转载请注明原作者出处!