昆明网站建设培训,简历模板个人简历,油田公司健康企业建设,如何网站做淘客Python爬虫学习#xff08;三#xff09; 使用BeautifulSoup解析网页并下载图片模拟用户登录处理使用代理视频下载#xff0c;防盗链的处理多线程与多进程 使用BeautifulSoup解析网页并下载图片
目的#xff1a;对某网站的某个专栏页面的图片进行下载得到高清图。 思路三 使用BeautifulSoup解析网页并下载图片模拟用户登录处理使用代理视频下载防盗链的处理多线程与多进程 使用BeautifulSoup解析网页并下载图片
目的对某网站的某个专栏页面的图片进行下载得到高清图。 思路从主页获取每张图片对应的子页面的链接地址在子页面找到对应的高清图片下载地址然后下载。查找使用BeautifulSoup直接从主页拿到的图片下载链接为缩略图这里想要下载的是高清的图片。
import time
import requests
from bs4 import BeautifulSoupdomain https://www.umei.cc/
# url https://www.umei.cc/bizhitupian/weimeibizhi/ # 唯美壁纸专栏
url https://www.umei.cc/bizhitupian/fengjingbizhi/ # 风景壁纸专栏
# 浏览器的标头身份标识信息
headers {User-Agent: 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
}resp requests.get(url, headersheaders)
print(服务器响应状态码, resp.status_code)
resp.encoding utf-8 # 处理乱码# 把主页源代码交给BeautifulSoup
main_page BeautifulSoup(resp.text, html.parser)
# 获取图片子页源码链接
alist (main_page.find(div, class_item_list infinite_scroll).find_all(a, class_img_album_btn))# print(alist)
img_num 0
for a in alist:href a.get(href) # 直接通过get就可以拿到属性的值child_url domain href.strip(/)# print(child_url) # 子页面网址# 拿到子页面的源代码child_page_resp requests.get(child_url, headersheaders)child_page_resp.encoding utf-8# 从子页面中获取图片的下载路径child_page BeautifulSoup(child_page_resp.text, html.parser)div_list child_page.find(div, class_big-pic)image_src div_list.find(img).get(src) # 用get拿到标签的对应属性image_name_src div_list.find(img).get(alt)[:-1] .jpg# print(image_src) # 打印图片下载地址http://kr.shanghai-jiuxin.com/file/bizhi/20220927/5wn4old1jef.jpg# print(image_name_src) # 红色,爱心,心,玫瑰,叉子,刀.jpg# 下载图片img_resp requests.get(image_src)# 获取url中最后一个/以后的内容作为图片名称# img_name_url image_src.split(/)[-1] #5wn4old1jef.jpgwith open(data_file/img/ image_name_src, modewb) as f:f.write(img_resp.content) # img_resp.content #这里得到的是字节数据img_num img_num 1print(fDownload successfully!\t{img_num}{image_name_src})# 只下载前6景图片if img_num 6:img_resp.close()child_page_resp.close()breaktime.sleep(3) # 每下载一张图片休息3s
print(Over!!!)
resp.close()模拟用户登录处理
方法1使用会话session对象使用session.get()、session.post()进行请求
session requests.session()
resp session.post()
# resp session.get()方法2使用requests.get()在headers中设置参数直接从浏览器中复制对应的Cookie
resp requests.get(urlurl, headers{Cookie: 一长串内容})# 注代码不能正常运行仅做示例
# 登录-得到cookie带着cookie 去请求服务器
# 使用session进行请求-session你可以认为是一连串的请求。在这个过程中的cookie不会丢失
import requests# 登录账户与密码信息(仅做示例)
data {loginName: 15100001234,password: 1234abcd
}# 会话
session requests.session()# 1.登录
url https://passport.17k.com/ck/user/login
resp session.post(url, datadata)
# print(resp.json())
print(resp.cookies)# 2.拿书架上的数据
# 刚才的那个session中是有cookie的
url2 https://user.17k.com/ck/author/shelf?page1appkey2406394919
resp1 session.get(urlurl2) # 第一种方法
print(resp1.json())resp2 requests.get(urlurl2, headers{# 第二种方法使用requests.get()在headers中设置参数直接从浏览器中复制对应的CookieCookie: GUIDabcdfa-adg-ag;c_channel0;c_cscweb;UM_distinctid1771614336271# 实际的Cookie很长一串这里仅做示范瞎写的
})
print(resp2.text)使用代理
请求时传入一个proxies参数
resp requests.get(url, proxiesproxies)# 代码不能正常运行仅做示例想要正常运行需要寻找可用的代理IP节点
import requests# 218.60.8.83:3129 找一个可用的代理IP
proxies {https: https://218.60.8.83:3129# http: #具体使用哪种看具体的网站
}url https://www.baidu.comresp requests.get(url, proxiesproxies)
print(服务器响应状态码, resp.status_code)
resp.encoding utf-8 # 处理乱码
print(resp.text)视频下载防盗链的处理
根据某视频文章页面的网页链接下载文章对应的视频 思路
拿到contId拿到videoStatus返回的json.- srcURL对srcURL内容进行修正下载视频
防盗链添加一个参数
referer: urlimport requestsurl https://www.pearvideo.com/video_1795368
# url https://www.pearvideo.com/video_1689388contId url.split(_)[1] # 1795368
# print(contId)videoStatusUrl fhttps://www.pearvideo.com/videoStatus.jsp?contId{contId}mrd0.7991879511806432
headers {User-Agent: 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,# 防盗链溯源当前本次请求的上一级是谁referer: url
}resp requests.get(videoStatusUrl, headersheaders)
# print(resp.text)dict resp.json()
srcUrl dict[videoInfo][videos][srcUrl] # 返回的虚假的地址
# print(srcUrl)
systemTime dict[systemTime]relSrcUrl srcUrl.replace(systemTime, fcont-{contId}) # 寻找规律进行替换得到的真实的地址
print(relSrcUrl)# srcUrl: https://video.pearvideo.com/mp4/short/20240802/1723116619381-16034050-hd.mp4 返回的虚假的地址
# relUrl: https://video.pearvideo.com/mp4/short/20240802/cont-1795368-16034050-hd.mp4 实际真实的地址
# https://video.pearvideo.com/mp4/short/20240802/cont-1795368-16034050-hd.mp4# 根据真实下载地址下载视频
with open(f{contId}.mp4, modewb) as f:f.write(requests.get(relSrcUrl).content)print(Over!!!)
resp.close()
多线程与多进程
# 线程进程
# 进程是资源单位每一个进程至少要有一个线程
# 线程是执行单位# 启动每一个程序默认都会有一个主线程
def func():for i in range(100):print(func, i)if __name__ __main__:# print(hello wolrd)func()for i in range(100):print(main, i)
多线程的第一种写法
# 多线程
from threading import Thread # 线程类# 多线程的第一种写法
def func():for i in range(100):print(func, i)if __name__ __main__:t Thread(targetfunc) # 创建线程并给线程安排任务t.start() # 多线程状态为可以开始工作状态具体的执行时间由CPU决定for i in range(100):print(main, i)
多线程的第二种写法
# 多线程
from threading import Thread # 线程类# 多线程的第二种写法
class MyThread(Thread):def run(self):for i in range(100): # 固定的 --当线程被执行的时候被执行的就是run()print(子线程, i)if __name__ __main__:t MyThread() # 创建线程并给线程安排任务# t.run() # 注意这种写法会被当成方法的调用.--成为单线程t.start() # 开启线程for i in range(100):print(主线程, i)多线程的传参
from threading import Thread # 线程类# 多线程的传参
def func(name):for i in range(100):print(name, i)if __name__ __main__: # 传递参数必须是元组逗号不能省不能写成args(周杰伦)t1 Thread(targetfunc, args(周杰伦,))t1.start()t2 Thread(targetfunc, args(王力宏,))t2.start()多进程
from multiprocessing import Process # 进程类def funcc():for i in range(100):print(子进程, i)if __name__ __main__:p Process(targetfuncc)p.start()for i in range(100):print(主进程, i)