网站变慢的原因,换模板搭建网站怎么做,网站建设seo 视频,培训学校加盟python爬取网站的图片
本次爬取图片所需要用到的库#xff1a;Requests库#xff0c;BeautifulSoup库#xff0c;正则表达式#xff0c;os库。
思路#xff1a;先爬一张图片#xff0c;再爬一个网站的图片
先爬一张图片#xff1a;
首先要得到这张图片的地址#x…python爬取网站的图片
本次爬取图片所需要用到的库Requests库BeautifulSoup库正则表达式os库。
思路先爬一张图片再爬一个网站的图片
先爬一张图片
首先要得到这张图片的地址可以直接找到图片然后复制地址还可以在网站中右击然后检查(谷歌浏览器快捷键是F12中找到这里用后种方式方便后面的理解如图 然后就可以把地址复制到代码中去代码如下
import requests
import os #这是一个和路径相关的库
#图片所在的网址,jpg,png等格式
urlhttps://files.yande.re/image/f312298021cf93355d185e3e28e5b52c/yande.re%20535947%20berserker_of_black_%28fate_apocrypha%29%20breast_hold%20cleavage%20dress%20fate_apocrypha%20fate_grand_order%20fate_stay_night%20horns%20samsafe%20wedding_dress.jpgrootF://pic// #需要存储的根目录
pathrooturl.split(/)[-1] #需要存储的路径以及文件名,若要自定义文件名则只需将改为pathroot文件名.jpgtry: #处理异常用if not os.path.exists(root): #判断根目录是否存在不存在就创建os.mkdir(root)if not os.path.exists(path): #查看文件文件路径)是否存在rrequests.get(url) #浏览器向服务器发出请求print(r.status_code) #查看状态码结果为200则获取成功 with open(path,wb) as f:f.write(r.content) #把获取到的内容以二进制形式写入文件图片等文件都是二进制存储的f.close() #写完后好像with自己会关这行代码可要可不要print(文件保存成功)else:print(文件已存在)
except:print(爬取失败)代码的详细注释都在上面执行之后的图片如下 这张图片有2.11M的大小花了71秒接下来爬取一个网站的图片。
思路先爬取网站所有图片的网址再利用循环像刚刚那样就可以爬整个网站的图片了。代码如下
#图片等文件爬取全代码
import requests
import os
import re
from bs4 import BeautifulSouphtmlhttps://yande.re/post?tagsfate%2Fstay_night
resrequests.get(html) #有了网站地址后向服务器发出请求
bsBeautifulSoup(res.text,lxml) #运用解析库解析获取的内容#通过正则表达式和beautifulsoup的find_all函数获取所有图片的地址,并且以列表形式返回给images
imagesbs.find_all(a,{class:directlink largeimg,href:re.compile(r\.jpg)})for image in images: #在列表中循环urlimage[href] rootF://pic// #需要存储的根目录pathrooturl.split(/)[-1] #需要存储的路径以及文件名若要自定义文件名则只需将改为pathroot文件名.jpgtry:if not os.path.exists(root): #查看根目录是否存在不存在就创建os.mkdir(root)if not os.path.exists(path): #查看文件文件路径)是否存在rrequests.get(url) #浏览器向服务器发出请求 with open(path,wb) as f:f.write(r.content) #把获取到的内容以二进制形式写入文件图片等文件都是二进制存储的f.close() #写完后好像with自己会关这行代码可要可不要print(文件保存成功) else:print(文件已存在)except:print(爬取失败)然后执行就可以了在写博客的时候发现存在一个问题整个代码向服务器发送了两次请求一次请求网站地址的内容一次请求图片网址的内容降低了运行速度不知道其他算法写的代码需不需要请求两次刚开始学爬虫不懂的还有很多有意见或者建议请在评论里发言。下面更新后的完整代码增加了对付反爬虫机制以及计数的代码。
#图片等文件爬取全代码
import requests
import os
import re
from bs4 import BeautifulSoup
import random
import timei0 #用来计数
#代理ip针对反爬虫机制
proxylist[{http:http://182.88.122.115:9797},{http:http://183.49.87.142:9000},{http:http://125.32.81.197:8080}
]
proxyrandom.choice(proxylist)
#请求头针对反爬虫机制
agent1Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 #谷歌
agent2Mozilla/5.0 (Windows NT 6.1; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36 #360
agent3Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;\WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5\.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; \.NET4.0E; QQBrowser/7.0.3698.400) #qq
agent4Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 \
(KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0 #搜狗
agent5Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36 #UC
list1[agent1,agent2,agent3,agent4,agent5]for x in range(0,10):agentrandom.choice(list1) #随机选一个ip地址header{User-Agent:agent} #随机选一个user-agenthtmlhttps://anime-pictures.net/pictures/view_posts/str(x)?search_tagkatou%20megumiorder_bydateldate0langen resrequests.get(html,proxiesproxy,headersheader)time.sleep(1) #有了网站地址后向服务器发出请求bsBeautifulSoup(res.text,lxml) #运用解析库解析获取的内容#通过正则表达式和beautifulsoup的find_all函数获取所有图片的地址,并且以列表形式返回给imagesimagesbs.find_all(img,{src:re.compile(r\.jpg)})for image in images: #在列表中循环urlhttp:image[src] rootF://路人女主1// #需要存储的根目录pathrooturl.split(/)[-1] #需要存储的路径以及文件名若要自定义文件名则只需将改为pathroot文件名.jpgtry:if not os.path.exists(root): #查看根目录是否存在不存在就创建os.mkdir(root)if not os.path.exists(path): #查看文件文件路径)是否存在rrequests.get(url,proxiesproxy,headersheader) #浏览器向服务器发出请求time.sleep(1) with open(path,wb) as f:f.write(r.content) #把获取到的内容以二进制形式写入文件图片等文件都是二进制存储的f.close() #写完后好像with自己会关这行代码可要可不要print(文件保存成功str(i)) ii1 else:print(文件已存在str(i))ii1except:print(爬取失败str(i))ii1
print(i)