网页爬虫抓取百度图片(强度不算很大,其实都是之前做过的事情,主要是用BS4来爬取网页图片)
优采云 发布时间: 2022-04-06 10:00网页爬虫抓取百度图片(强度不算很大,其实都是之前做过的事情,主要是用BS4来爬取网页图片)
今天的力度不是很大,其实之前都做过,主要是用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的理解,我还是输入了一张单图然后获取二级子页面的下载。网址。
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)
最后是下载图片,因为获取到的图片内容是字节,所以我们写文件的时候,模式选择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会变得很卡,所以我们可以右击存放图片的文件夹,找到标记目录为-->excluted,这样pycharm就会将该文件夹内的文件不被索引。