前言
之前的学习不是很努力就间断更新了,现在所有的内容是在具有python基础和web基础上继续更新的。接下来是爬虫和Flask框架共同更新,一起加油吧。
接v:13053025350(毕设,小程序)
看不懂python基础的可以阅读博主前几篇python学习的前三章
看不懂web的可以阅读博主的第1-3篇博客(html,css,js)
养成习惯,先赞后看,重新来过一遍。
爬虫的定义
爬虫(Crawler),也称为网络爬虫或网络蜘蛛,是一种自动化程序,用于在互联网上收集、分析和存储信息。它通过模拟人类用户的行为,自动访问网页、提取数据并进行处理,以获取所需的信息。爬虫主要用于搜索引擎的索引、数据挖掘、网站监测、信息抓取等领域。
简单说:
- 定义访问的链接网站
- 对该请求进行伪装,通过机器模拟人的行为去发送请求
- 得到响应结果之后,对数据进行处理
- 对数据进行分析或者其他用途
注意:违法的咱不能爬,灰产的业务不能接,这个适合做副业,自己甄别吧!
第一个爬虫
from urllib.request import urlopen
# 设置要请求的 URL
# 此处要注意的是http而不是https
baseUrl = 'http://www.baidu.com/'
try:
# 发起请求并获取响应
response = urlopen(baseUrl)
# 读取响应内容
readContent = response.read()
# 解码为字符串
decode_Content = readContent.decode('utf-8')
# 将内容保存为 HTML 文件
with open('01_baidu.html', 'w', encoding='utf-8') as file:
file.write(decode_Content)
print("网页内容已成功保存为 baidu.html")
except Exception as e:
print(f"发生错误: {e}")
代码解释
这段代码是使用Python的urllib库来访问百度网站并将网页内容保存为一个HTML文件。
1、首先,我们导入了urllib库中的urlopen函数来发起一个HTTP请求
2、将百度网址作为请求的目标URL。注意,在此例中,我们使用http而不是https作为URL的协议。
3、尝试发起请求并获取响应。如果请求成功,我们将会得到一个response对象,其中包含了从百度网站返回的数据。
4、通过调用response对象的read()方法读取响应内容,该方法返回一个字节字符串。
5、调用decode()方法将字节字符串解码为UTF-8格式的字符串。
6、将解码后的内容保存为一个HTML文件。使用open()函数打开文件并使用'w'模式(写入模式)。我们指定编码为UTF-8,并将解码后的内容写入文件中。
如果这个过程中发生了任何错误,我们将会捕获异常并打印错误消息。否则,我们将输出提示信息,表示网页内容已成功保存为'01_baidu.html'文件。
headers定制
这个就是伪装自己的发送的请求,这个比较简单,前期通过简单的方式去伪装一下自己。
主要是通过Request库,可以将请求头和url进行组合,封装成一个新的请求
动态设置随机浏览器内核也是很棒的,使用random中的choice的随机数字
from urllib.request import urlopen
from urllib.request import Request
from random import choice
# 基本请求的地址 , 定制请求对象就可以访问百度的连接地址 https
baseUrl = "https://movie.douban.com/top250"
# 动态设置随机的浏览器
user_agents=[
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
]
# headers定制
headers = {
"User-Agent": choice(user_agents)
}
# 请求连接封装
req = Request(baseUrl, headers=headers)
# 发送请求
response = urlopen(req)
# 读取内容
res_read = response.read()
# 编码格式
res_decode = res_read.decode('utf-8')
# 保存请求的页面
with open('02_baidu.html','w',encoding='utf-8') as file:
file.write(res_decode)
print('02_网页下载成功')
上面都是有注释的,每一行是干啥的,感兴趣的小伙伴,可以直接复制,点击运行试试看吧!
get请求和post请求携带参数的方式
get请求
from random import choice
from urllib.request import urlopen, Request
from urllib.parse import quote
from urllib.parse import urlencode
# 中文参数转码第一种方式 使用parse中的quote方法 quote('张三')
# 中文参数转码第二种方式 使用parse中的urlencode方法 urlencode({"w":'张三'})
search = {
'q':'合肥电影',
"w":'你好'
}
# print(urlencode(search))
# url= 'https://cn.bing.com/search?q={}'.format(quote(search))
url= 'https://cn.bing.com/search?{}'.format(urlencode(search))
print(url)
# 动态设置随机的浏览器
user_agents=[
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
]
# headers定制
headers = {
"User-Agent": choice(user_agents)
}
request = Request(url,headers=headers)
content = urlopen(request)
content_read = content.read()
content_decode = content_read.decode('utf-8')
print(content_decode)
post请求
from urllib.request import urlopen, Request
from urllib.parse import urlencode
url= 'http://www.sxt.cn/index/login/login.html'
data ={
"user":'17703181473',
"password":"123456"
}
f_data = urlencode(data)
# headers定制
headers = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
}
# 如果post请求出现这个报错
# TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.
# 需要使用encode() request = Request(url,headers=headers,data=f_data.encode())
request = Request(url,headers=headers,data=f_data.encode())
content = urlopen(request)
content_read = content.read()
content_decode = content_read.decode('utf-8')
print(content_decode)
注意
如果出现:
TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str. 需要使用encode() request = Request(url,headers=headers,data=f_data.encode())
百度贴吧实战
需求:将百度贴吧的某个词条下面的所有评论和页面保存成html,保存在本地的当前目录中(数据清洗和数据提取,在后期慢慢来)
代码如下:
from urllib.request import Request
from urllib.request import urlopen
from urllib.parse import quote
# 获取到传过来的地址,进行请求定制封装
def get_html(url):
headers = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) '
'Chrome/131.0.0.0 Safari/537.36',
}
# 封装请求
req = Request(url, headers=headers)
# 发起请求得到响应
response = urlopen(req)
# 将得到的返回值-html返回出去
return response.read().decode()
# 保存页面
def save_html(html, filename):
# 将得到的页面进行保存在本地
with open(filename, 'w', encoding='utf-8') as file:
file.write(html)
# 入口参数文件
def main():
content = input("请输入搜索词条:")
num = int(input('请输入获取的页数:'))
# 循环操作
for i in range(num):
# 地址封装
url = "https://tieba.baidu.com/f?ie=utf-8&kw=" + quote(content) + "&fr=search&pn={}".format(i * 50)
# 调用get_html函数,得到return 的返回值
html_request = get_html(url)
# 拼接返回的名称
filename = '第' + str(i + 1) + "页.html"
# 调用保存的html的页面
save_html(html_request, filename)
# 启动文件
if __name__ == '__main__':
main()
核心步骤:
- 爬取地址的选择
- 请求头的定制
- 拼接参数,发送请求得到响应
- 存储文件到本地
豆瓣top250实战
from urllib.request import Request
from urllib.request import urlopen
from time import sleep
headers = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) '
'Chrome/131.0.0.0 Safari/537.36',
}
url="https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=60000&limit=20"
# url="https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=60&limit=20"
i = 0
base_url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={}&limit=20"
while True:
req = Request(base_url.format(i*20),headers=headers)
req_read = urlopen(req)
req_decode =req_read.read()
content =req_decode.decode('utf-8')
print(content)
if(content == "[]"):
break
else:
i+=1
sleep(3)
注意:
里面有一个sleep(3),是让该程序3秒后在执行,减少对爬取网站的访问频次(小技巧)
while True死循环,直到content == “[ ]”,结束循环。
结语
更新速度可能没有那么快,因为还要一遍学习flask,一遍工作,一遍学习爬虫。
如果您看到这,点个赞吧~~~~~~~
开源项目
Vue2Admin和Vue3Admin版本的后台还没有对接口,但是整体的框架已经启动;
uniClient和vue的一样都没有进行开发,但是整体框架已经启动;
目前正在开发ReactAdmin的版本:React + typescript + Antd;
后台使用的是:Koa + Mysql + Sequelize;
值得注意的是,该项目只需要本地安装mysql ,但是不需要导入sql文件,运行modal即可。