Python爬虫爬取图片

**

Python爬虫爬取网站指定图片(多个网站综合经验结论分享)

**
我想以这篇文章来记录自己学习过程以及经验感受,因为我也是个初学者。接下来我将分享几个我爬取过的图片网站,给大家们分享下自己的方法经验。嘿嘿!

我选了以下两个具有代表性的网站进行分享

网站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()

每个网站的代码都会有自己不一样的地方,因此我们在爬取不同网站时,就会遇到不同的问题。但是,只要我们下功夫去研究,就一定能解决问题!

文中有解释不到位或者错误的地方,欢迎各位大佬们指正哦。

之后我还会继续分享自己的学习经历,让自己不断成长!

冲呀冲呀冲呀!!!

  • 55
    点赞
  • 304
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值