**
**
我想以这篇文章来记录自己学习过程以及经验感受,因为我也是个初学者。接下来我将分享几个我爬取过的图片网站,给大家们分享下自己的方法经验。嘿嘿!
我选了以下两个具有代表性的网站进行分享
网站1: 摄图网
第一步:导入需要用到的库:requests、BeautifulSoup和time
import requests
from bs4 import BeautifulSoup
import time
第二步:伪装自己的爬虫
因为很多网站都是有反爬虫的,所以我们需要把我们的头部伪装一下。不然我们的PyCharm就会很老实的告诉浏览器,这是一个爬虫来对你的网站进行浏览爬取。所以我们要改变我们的头部。
打开网页后,按F12,检查。然后点击Network,再按F5进行刷新,找到第一个之后会出现另一个界面,点击headers,翻到最下面,User-Agent就是我们需要的伪装的头部信息。
代码是这样的:
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75"
}
第三步:观察网页的链接信息
第一个函数:我们观察网站,它不是只有一页,因此我们就需要进行翻页操作。我们就用for循环来进行,然后我们需要观察每一页的链接的变化来找规律。我们可以借助记事本来找规律,如下图:
不难发现规律,只是后面的2、3在改变。但是第一页的不一样,我们就把2改成1看是否可以成功的跳转到第一页。这个网站是可以的,如果不可以的话我们就用if语句来解决,这个在下面另一个的网站我会给大家说到。做好这一步之后我们就把值代入下一个函数。
def down1():
for i in range(1, 3):
url = "https://699pic.com/originality-0-176-" + str(i) + ".html"
down2(url)
这个函数也是我们的主函数,在最后的最后需要我们去调用它
if __name__ == "__main__":
down1()
第四步:向网站发起请求访问,看是否访问成功
第二个函数:这里就用到了requests库,get便是向网站发起访问请求,想知道是否访问成功,便要用到r.status_code,将其print,若结果是200,便是访问成功。若为404或其它,则是访问失败,便要去查看前面哪里出错了。为了避免出现乱码的情况,我们需要将编码格式改为“utf-8”或者等于r.apparent_encoding。r.text是网页的内容,我们将这个内容带给下一个函数。
def down2(neirong):
r = requests.get(neirong, headers=header)
r.encoding = "utf-8" #r.apparent_encoding
print(r.status_code)
demo = r.text
# print(demo)
down3(demo)
第五步:解析网页的内容,并分析找到图片的标签位置
第三个函数:这里就需要用到BeautifulSoup库了,将上一个函数带来的内容用html.parser解析器进行解析。然后用到BeautifulSoup的find_all函数来对所需要的标签内容进行查找,用打印找的内容进行长度输出的方式来验证自己是否查找成功。因为找到的是多个,因此需要挨个输出。这个网站的照片是放在img标签的data-original属性里面的,并不是src属性里面。若是用src属性则爬取到的图片将是黑色的什么都没有,用data-original属性爬取的才是正确的。至于为什么,这个应该就是JavaScript的知识内容了,这里就不做解释了。并且data-original属性里面的内容还需要在前面加上https:,因为它本身缺少了这个东西,因此我们就需要给它加上。然后将这个内容代给下一个函数。
def down3(biaoqian):
soup = BeautifulSoup(biaoqian, "html.parser")
tags = soup.find_all("img", class_="lazy")
print(len(tags))
# print(tags)
for tag in tags:
image = "https:" + tag["data-original"]
print(image)
down4(image)
第六步:将解析的照片存入到我们的文件夹中去
第四个函数:这里就用到了time,PyCharm自带的库。照片的命名方式用的是时间戳,并且放大了1000倍。我们将解析好的内容再次通过requests的get方法去到每一个图片特定的网址去下载。因为是图片,所以将其通过二进制的方式写入到我们的文件夹中去。这里使用的是相对路径,是写入到同级目录的image文件夹,这里的./可有可无,原因就是这个代码和image是在同级目录下。
def down4(shuchu):
print(time.time())
fileName = "./image/" + str(int(time.time() * 1000)) + ".jpg"
r = requests.get(shuchu, headers=header)
f = open(fileName, "wb")
f.write(r.content)
f.close()
这里就是爬取这个网站指定图片的的全部过程了。
下面是完整代码:
import requests
from bs4 import BeautifulSoup
import time
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
}
def down1():
for i in range(1, 3):
url = "https://699pic.com/originality-0-176-" + str(i) + ".html"
down2(url)
def down2(neirong):
r = requests.get(neirong, headers=header)
r.encoding = "utf-8" #r.apparent_encoding
print(r.status_code)
demo = r.text
# print(demo) #查看网页的内容
down3(demo)
def down3(biaoqian):
soup = BeautifulSoup(biaoqian, "html.parser")
tags = soup.find_all("img", class_="lazy")
print(len(tags)) 查看找到的标签数量#
# print(tags) #查看标签内容
for tag in tags:
image = "https:" + tag["data-original"]
print(image)
down4(image)
def down4(shuchu):
print(time.time())
fileName = "image/" + str(int(time.time() * 1000)) + ".jpg"
r = requests.get(shuchu, headers=header)
f = open(fileName, "wb")
f.write(r.content)
f.close()
if __name__ == "__main__":
down1()
网站2: chinaz.com
这个网站爬取的过程大致和上面一个相同。
但不同的是第一个函数中用了if语句,因为它的第一页和之后的页规律是不一样的。(我们同样可以借助记事本去找寻和实验规律)
def down1():
for i in range(1,3):
if i == 1:
url = "https://sc.chinaz.com/tupian/katongtupian.html"
else:
url = "https://sc.chinaz.com/tupian/katongtupian_" + str(i) + ".html"
down2(url)
以及第三个函数的标签,这里有一个坑,那就是检查网页代码时显示的是在src属性里,但总是会报错。于是我查看了网页的源代码,发现不是src,而是src2,这个地方不去多注意还真发现不了。
下面是爬取这个网站指定图片的全代码:
import requests
from bs4 import BeautifulSoup
import time
header={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
}
def down1():
for i in range(1,3):
if i == 1:
url = "https://sc.chinaz.com/tupian/katongtupian.html"
else:
url = "https://sc.chinaz.com/tupian/katongtupian_" + str(i) + ".html"
down2(url)
def down2(neirong):
r = requests.get(neirong, headers=header)
r.encoding = "utf-8"
print(r.status_code)
demo = r.text
#print(demo)
down3(demo)
def down3(biaoqian):
soup = BeautifulSoup(biaoqian, "html.parser")
tags = soup.find_all("div", class_="box picblock col3")
print(len(tags))
#print(tags)
for tag in tags:
image = "https:" + tag.a.img["src2"]
#print(image)
down4(image)
def down4(shuchu):
print(time.time())
fileName = "./image/" + str(int(time.time() * 1000)) + ".jpg"
r = requests.get(shuchu, headers=header)
f = open(fileName, "wb")
f.write(r.content)
f.close()
if __name__=="__main__":
down1()
每个网站的代码都会有自己不一样的地方,因此我们在爬取不同网站时,就会遇到不同的问题。但是,只要我们下功夫去研究,就一定能解决问题!
文中有解释不到位或者错误的地方,欢迎各位大佬们指正哦。
之后我还会继续分享自己的学习经历,让自己不断成长!
冲呀冲呀冲呀!!!