首先下载并导入基本的库函数
import re
import time
import os.path
import requests
import urllib3
获取请求头(模拟浏览器访问网页)
获取方式:在网页空白处右击,选择“检查”,点击浏览器页面左上角刷新按钮,然后点击“网络”,随便点击一个元素,在右下角位置即出现User-Agent即位请求头,复制即可。如下图所示:
以美食图片网站https://www.foodiesfeed.com/为例(将请求头复制在下面句子中)。
headers = {'user-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.55'}
url = 'https://www.foodiesfeed.com/' # 网页地址(点击网站首页白色花图片)
session = requests.session() # 保持会话
urllib3.disable_warnings() # 隐藏一些警告信息
# 获取网页内容,防止请求失败程序中断 ,加入异常机制
while True:
try:
res = session.get(url=url, headers=headers, verify=False) # 获取网页源码
break
except:
print("连接失败...")
print("睡眠5秒...")
print("ZZzzzz...")
time.sleep(5)
print("继续连接...")
continue
res.encoding = "utf-8"
html = res.text # 解析网页源码
print(html)
# 正则表达式匹配下载链接
urls = re.findall('img width=".*?" height=".*?" src="(.*?)" class=".*?" '
'alt=".*?" decoding=".*?" loading=".*?" title=".*?"', html)
print(urls)
其中re表达式中,".?“表示忽略冒号内的内容,”(.?)"表示匹配当前冒号内的内容。
# 保存图片
dir_name = 'foot picture' # 文件夹名称
if not os.path.exists(dir_name):
os.mkdir(dir_name)
for i in urls:
time.sleep(2) # 睡眠2秒钟,防止请求太快导致网页崩溃
figure_name = re.findall(f'img width=".*?" height=".*?" src="{i}" class=".*?" '
'alt="(.*?)" decoding=".*?" loading=".*?" title=".*?"', html)[0]
print(figure_name) # 文件名称
if figure_name == '': #匹配不到文件名则跳过,或者自定义文件名
continue
while True:
try:
response = requests.get(i, headers=headers) #获取当前图片内容
break
except:
print("连接失败...")
print("睡眠5秒...")
print("ZZzz...")
time.sleep(5)
print("继续连接...")
continue
with open(dir_name + '/' + figure_name+'.jpg', 'wb') as f: # 以写入的方式打开文件
f.write(response.content) # 写入文件内容
print("下载成功!")
其中最关键的是正则表达式匹配,鼠标右击,点查看网页源代码,找到图片链接所在位置,复制每个图片链接前后都相同的内容,如上面例子中的"img width=、height=、src=、class=、 'alt=“(.*?)” decoding=、 loading=、title=" 在每个图片链接周围都有,那么用正则表达式匹配图片链接,即src=(.*?)。
爬取其他类型数据,如果文本、视频等与此类似。