本帖最后由 lihu5841314 于 2021-6-14 22:22 编辑
[Asm] 纯文本查看 复制代码 import requests
from multiprocessing.dummy import Pool
from urllib import parse
from bs4 import BeautifulSoup
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",
"Referer": "https://www.umei.net/"
}
#1.获取url响应
def response(url):
resp = requests.get(url=url,headers=headers)
resp.encoding = resp.apparent_encoding
# print("正在传送response")
return resp
#2.实例化BeautifulSoup 解析出图片的详情页url地址
def Soup(resp):
soup = BeautifulSoup(resp.text,"lxml") #容易忘记填写"lxml"或者"html.parse"
alist = soup.find("div",attrs={"class":"TypeList"}).find_all('a',attrs={"class":"TypeBigPics"}) #获取页面的所有a标签
for a in alist:
a_href = a.get("href") #发现网址不全 需要补全
a_url =parse.urljoin(html_url,a_href) #urljoin补全网址挺好用的
img_title = a.text
# print(a_url) #有了详情页网址 当然发送请求拿到详情页响应数据
a_resp = response(a_url)
a_soup = BeautifulSoup(a_resp.text,"lxml")
img_url = a_soup.find("div",attrs={"class":"ImageBody"}).find("img").get("src") #findall是列表 不能直接get取
img_save(img_title,img_url,1)#第一页持久化存储
# 拿到图片url 发现下面有页表是套图 找到规律就是第一个图片url后面加页码
# https://www.umei.net/meinvtupian/meinvxiezhen/234305_7.htm 试试第一页把7改成1直接404 想法就是把第二图之后url和第一页url放到一个列表中
# for i in range(20):
# img2_url = parse.urljoin(img_url,f'_{i}.htm') #直接粗暴的把页面弄多些 用try except 的方式去除无用的url 测试是可行的 但是不美观
# 发现图片下面连接有尾页标签我直接取到尾页url 把页码取出来不就有总页数了
page = [a for a in a_soup.find_all("a") if a.text == "尾页"][0] # 用推导式找到尾页a标签
page1 = str(page).split("_")[0].split("/")[-1]
page2 = str(page).split("_")[1].split(".")[
0] # 要去除页码 分析网页用_和. 分割 注意split分割的str类型 我以为page取出列表就是str类型 我还是太天真了
page2 = int(page2) # 转换成数字 好递加
for i in range(2, page2 + 1):
next_img_url = "https://www.umei.net/meinvtupian/meinvxiezhen/" + page1 + f'_{i}.htm'
resp_next = response(next_img_url)
soup_next = BeautifulSoup(resp_next.text,"lxml")
next_img_down_url = soup_next.find("div", attrs={"class": "ImageBody"}).find("img").get("src")
# print(next_img_down_url)
img_save(img_title,next_img_down_url,i)
def img_save(title,url,i):
resp = response(url).content #图片存储是二进制格式
path = title +str(i) + ".jpg"
with open(path,"wb") as f:
f.write(resp)
print(title +str(i),"下载成功")
if __name__ == '__main__': #一张一张的下载太慢了 简单开个进程池 图片太多开双进程池
pool = Pool(4)
urls = []
resps = []
html_url = "https://www.umei.net/meinvtupian/"
urls.append(html_url)
for g in range(2, 11): #一共517页 太多了改成10页 只为了练习 开双进程池失败 只有优先让下载用进程池了
me_url = f'https://www.umei.net/meinvtupian/index_{g}.htm'
urls.append(me_url)
for url in urls:
resp = response(url)
resps.append(resp)
print("进程池启动")
data = pool.map(Soup,resps)
pool.close()
pool.join() #今天学习到此结束
上一篇有问题 已修正不知道大家发现没有 [Asm] 纯文本查看 复制代码 import requests
from multiprocessing.dummy import Pool
from urllib import parse
from bs4 import BeautifulSoup
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"
}
#1.获取url响应
def response(url):
resp = requests.get(url=url,headers=headers)
resp.encoding = resp.apparent_encoding
# print("正在传送response")
return resp
#2.实例化BeautifulSoup 解析出图片的详情页url地址
def Soup(resp):
soup = BeautifulSoup(resp.text,"lxml") #容易忘记填写"lxml"或者"html.parse"
alist = soup.find("div",attrs={"class":"TypeList"}).find_all('a',attrs={"class":"TypeBigPics"}) #获取页面的所有a标签
for a in alist:
a_href = a.get("href") #发现网址不全 需要补全
a_url =parse.urljoin(html_url,a_href) #urljoin补全网址挺好用的
img_title = a.text
# print(a_url) #有了详情页网址 当然发送请求拿到详情页响应数据
a_resp = response(a_url)
a_soup = BeautifulSoup(a_resp.text,"lxml")
img_url = a_soup.find("div",attrs={"class":"ImageBody"}).find("img").get("src") #findall是列表 不能直接get取值
img_save(img_title,img_url,1)#第一页持久化存储
# print(img_url) #拿到图片url 发现下面有页表是套图 找到规律就是第一个图片url后面加页码
#https://www.umei.net/meinvtupian/meinvxiezhen/234305_7.htm 试试第一页把7改成1直接404 想法就是把第二图之后url和第一页url放到一个列表中
# for i in range(20):
# img2_url = parse.urljoin(img_url,f'_{i}.htm') #直接粗暴的把页面弄多些 用try except 的方式去除无用的url 测试是可行的 但是不美观
#发现图片下面连接有尾页标签我直接取到尾页url 把页码取出来不就有总页数了
page = [a for a in a_soup.find_all("a") if a.text=="尾页"][0] #用推导式找到尾页a标签
page= str(page).split("_")[1].split(".")[0] #要去除页码 分析网页用_和. 分割 注意split分割的str类型 我以为page取出列表就是str类型 我还是太天真了
page = int(page) #转换成数字 好递加
for i in range(2,page+1):
next_img_url = parse.urljoin(img_url,f'_{i}.htm')
#print(next_img_url) #第二页之后有了持久化存储
img_save(img_title,next_img_url,i)
def img_save(title,url,i):
resp = response(url).content #图片存储是二进制格式
path = title +str(i) + ".jpg"
with open(path,"wb") as f:
f.write(resp)
print(title +str(i),"下载成功")
if __name__ == '__main__': #一张一张的下载太慢了 简单开个进程池 图片太多开双进程池
pool = Pool(4)
urls = []
resps = []
html_url = "https://www.umei.net/meinvtupian/"
urls.append(html_url)
for g in range(2, 11): #一共517页 太多了改成10页 只为了练习 开双进程池失败 只有优先让下载用进程池了
me_url = f'https://www.umei.net/meinvtupian/index_{g}.htm'
urls.append(me_url)
for url in urls:
resp = response(url)
resps.append(resp)
print("进程池启动")
data = pool.map(Soup,resps)
pool.close()
pool.join() #今天学习到此结束 |