今天的强度不算很大,其实都是之前做过的事情,主要是还是用BS4里面的Beautifulsoup来爬取网页图片。因为老师用的是优美图库,但是我们现在已经使用不了了,所以在百度上随便找了一个桌面壁纸的网站,嘻嘻嘻下一点我喜欢的DOTA2壁纸。
#1.拿到主页面的源代码,然后提取到子页面的链接href
#2.通过href拿到子页面的内容,然后找到下载链接,进行下载 “img里面src的值就是下载地址”
#3.下载图片
这里的url1是因为子页面的url需要拼接主页url。但是我们使用的搜索出来的url和主页url不一致,所以这里把主页url携程url1.
import requests
from bs4 import BeautifulSoup
headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
url1="https://pic.netbian.com"
还是老套路,用for循环获取搜索dota的子页面的每一页的信息。总共有3页,0,1,2
for c in range(0,2):
url="https://pic.netbian.com/e/search/result/index.php?page="+"c"+"&searchid=2700"
resp=requests.get(url,headers=headers)
resp.close()
#print(resp.text)
日常代码解析,变成bs4类型
#把源代码交给beautifulsoup
main_page=BeautifulSoup(resp.text,"html.parser")
a_list=main_page.find("ul",class_="clearfix").find_all("a")
#print(a_list)
其实这里我多写了一步,在搜索结果的子页面里面就已经包含了下载地址的url,但是为了多训练一下自己对bs4的理解,我还是进入了单一图片后再获取次级子页面的下载url 。
for a in a_list:
#print(url1+a.get("href"))#直接通过get可以获得属性的值
#拿到子页面的源代码
child_page_resp=requests.get(url1+a.get("href"),headers=headers)
child_page_resp.close()
#丛子页面中拿到图片的下载地址
child_page=BeautifulSoup(child_page_resp.text,"html.parser")
child_page_img_label=child_page.find("div",class_="photo-pic").find("img")
downloadurl=child_page_img_label.get("src")
#print(url1+downloadurl)
最后是下载图片,因为获取的图片内容是字节,所以我们写入文件的时候mode选择wb。然后用url最后一个“/”后面的内容作为图片的名字。
#下载图片
img_resp=requests.get(url1+downloadurl)
img_resp.content#这里拿到的是字节
img_name=downloadurl.split("/")[-1]#拿到url中最后一个/后面的内容作为图片名称
with open(img_name,mode="wb") as f:
f.write(img_resp.content) #图片内容写入文件
print("over!",img_name)
最后我们所有的代码如下图所示:
#1.拿到主页面的源代码,然后提取到子页面的链接href
#2.通过href拿到子页面的内容,然后找到下载链接,进行下载 “img里面src的值就是下载地址”
#3.下载图片
import requests
from bs4 import BeautifulSoup
headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
url1="https://pic.netbian.com"
for c in range(0,2):
url="https://pic.netbian.com/e/search/result/index.php?page="+"c"+"&searchid=2700"
resp=requests.get(url,headers=headers)
resp.close()
#print(resp.text)
#把源代码交给beautifulsoup
main_page=BeautifulSoup(resp.text,"html.parser")
a_list=main_page.find("ul",class_="clearfix").find_all("a")
#print(a_list)
for a in a_list:
#print(url1+a.get("href"))#直接通过get可以获得属性的值
#拿到子页面的源代码
child_page_resp=requests.get(url1+a.get("href"),headers=headers)
child_page_resp.close()
#丛子页面中拿到图片的下载地址
child_page=BeautifulSoup(child_page_resp.text,"html.parser")
child_page_img_label=child_page.find("div",class_="photo-pic").find("img")
downloadurl=child_page_img_label.get("src")
#print(url1+downloadurl)
#下载图片
img_resp=requests.get(url1+downloadurl)
img_resp.content#这里拿到的是字节
img_name=downloadurl.split("/")[-1]#拿到url中最后一个/后面的内容作为图片名称
with open(img_name,mode="wb") as f:
f.write(img_resp.content) #图片内容写入文件
print("over!",img_name)
print("all over!")
这里面存在一些问题,因为我使用的是for循环去获取搜索结果页面0,1,2的图片,但是for循环好像不起作用了,整个程序跑完得到的只有第一页的图片,后面两页的都没有。我以为是我的程序写错了,然后我取消了for循环,手动分别下载了0,1,2页面的图片,在仅注释 (for c in range(0,2):)这句话的基础上下载,结果完全正确,这就让我非常不解,因为有点累了,所以不想动脑经了,反正也没有人看这篇帖子,等未来有个有缘人帮我解答吧!
题外话,哈哈哈博主本人可以说是一个刀斯林了,完了好多年,可惜还是很菜。这里夹带点私活,放几张今天爬出来的我觉得很好的dota2的壁纸,希望这游戏不要死了吧。
---------------------------------------------分割线--------------------------------------------------------------------------
老师说最好还是加一个时间控制,避免访问过快
import time
******
time.sleep(1)#暂停一秒继续运行程序
还有另外一个坑就是,我是用的是pycharm,每次写入图片的时候,pycharm都会对所有文件创建一个索引,为了快速找到需求文件。但是我们下载图片是没必要索引的,另外如果我们下载图片很多的时候,ide就会变得很卡,所以我们可以对存放图片的文件夹右键,找到mark directory as ——>excluted,这样pycharm就不会对这个文件夹内的文件创建索引。