Python3 爬取糗事百科整张页面图片!
写代码必做的两件事:
1.做笔记!
2.代码一定要加上注释!
3.思路一定要清晰!
【adi:以下有何不懂请看注释!】
# 爬取糗事百科整张页面图片
# 导入 requests (网络请求库)、re、time
import requests
import time
import re
import sys
# 进行ua伪装
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60'
}
# 利用获取到的网页源码编写正则匹配模式
# <div class="thumb">
#
# <a href="/article/123939176" target="_blank">
# <img src="//pic.qiushibaike.com/system/pictures/12393/123939176/medium/Y22BN3IKIO1GEC4R.jpg" alt="糗事#123939176" class="illustration" width="100%" height="auto">
# </a>
# </div>
def dwonload_page():
start_page=int(input('请输入起始页>>>'))
end_page=int(input('请输入结束页>>>'))
return start_page,end_page # 返回用户输入的page(页码),供main函数使用!
def main():
global page_num #把page_num声明为全局变量因为在re_function 中要用到!(使用global关键字声明)
for page_num in range(start_page,end_page+1): #遍历用户输入的区间以获取用户想要的页面数据!+1是因为Python中是左闭右开所以要+1
page_url=f"https://www.qiushibaike.com/imgrank/page/{page_num}/" #指定要爬取的url
print(f'正在下载第{page_num}页的图片')
time.sleep(1) #设置一下睡眠时间也就是延迟不要给人家服务器那么大压力!
response=requests.get(url=page_url,headers=headers) #发送requests
global response_data #声明response_data为全局变量,因为后面要用(作用域关系!不声明后面的函数无法引用)
response_data=response.text #获取响应数据类型为text(也就是文本!)
# print(response_data)
re_function() # main()函数执行完毕之后执行re_function
return response_data #返回获取到响应数据!这个好像没有什么用!注释后面加的!
def re_function():
# 获取每一页的图片链接
re_pattern = r'<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>' #编写正则表达式以匹配(获取)图片链接!
result = re.findall(re_pattern, response_data, re.S) # 使用re模块中的findall方法匹配所有!返回一个列表!修饰符为re.S (也就是匹配包括换行在内的任意字符)
# print(result)
# 获取alt中的数字!
re_pattern_tow = r'<div class="thumb">.*?alt="糗事#(.*?)" class=.*?</div>'
result_one = re.findall(re_pattern_tow, response_data, re.S) #跟上面一样匹配所有以列表形式返回,匹配包括换行在内的所有/任意字符(修饰符:re.S)
# print(result_one)
re_data_dict = dict(zip(result,result_one)) # 把上面两个正则返回的两个列表(result_one, result_tow)合成一个字典(因为我们要一个个遍历当中的内容)!
i = 0
for image_data,image_name in re_data_dict.items(): #使用items()分别遍历出字典(re_data_dict)的键跟值
time.sleep(2.5) #设置睡眠时间
i += 1
print(f'正在下载第{page_num}页,第{i}张图片…………')
image_url=f'https:{image_data}' #因为爬取到的图片链接是不完整的所以这里我们要手动合成完整的图片链接
# print(image_url)
response_image_data=requests.get(image_url,headers) #向每个图片链接发送请求
response_image_data=response_image_data.content #获取响应数据(也就是图片),图片和视频为二进制的所以这里要用content
# 使用上下文管理器方式写入文件,当然你也可以使用其他方式写入 (好处在于自动关闭文件,又不会占用后台资源)
with open(f'E:\python实例\爬虫第一课\实例8:爬取糗事百科整张页面图片\image\{image_name}.jpg','wb') as adi_images:
adi_images.write(response_image_data)
print(f'第{page_num}页,第{i}张图片下载完成!')
if __name__ == '__main__': #程序入口!方便管理纠错!
start_page,end_page=dwonload_page() #接收函数返回的两个变量!给main()使用的!
main()
exit() # 下载完成后推出程序,以免占用后台资源!是sys库的函数!
#【adi:上面的整体代码结构并不是好感觉也不够安全,建议使用函数闭包或者类的方式——个人提醒!】
以上是个人练习经验总结!
启发:兴趣是最好的老师,学习成果是对自己最大的馈赠!