标题很明确了吧,我们如何才能在网页上爬取图片呢?
首先,打开一个网址:(就用这个举例子吧)
http://www.win4000.com/wallpaper_2285_0_0_1.html

那么,url就是它了,接下来,对url进行访问(记得UA伪装,可以通过抓包工具获得,这里我就不写了)

page_text=requests.get(url=url,headers=headers).text

图片肯定在页面的原码中,那么我们获得页面数据,就可以继续搜索图片的具体位置了
拿到页面后,用xpath解析的方式(这种方式我认为比较简便,当然也可以用正则表达式或者bs4),获得页面的li标签

tree=etree.HTML(page_text)
li_list=tree.xpath(’//*[@id=“JwaterFall”]/ul/li’)
如下图
在这里插入图片描述

通过xpath,我们获得的是一个list对象,存放着我们所有的li标签,通过for循环,获取每一个li标签的图片详情页地址

li_list=tree.xpath('/html/body/div[5]/div/div[3]/div[1]/div[1]/div/div/div/ul/li')

地址打开后,还没有结束,我们还需要得到图片的地址链接(我们现在得到的是图片详情页的链接)
再根绝xpath,获取图片的链接,这时候,我们是在li标签下获得href的,因此xpath可以写为:

li.xpath(’./a/@href’)[0]

但这里依旧是列表,因此我们需要加个[0]来获得地址详情页的在这里插入图片描述
获得详情页的链接后,记得requests访问,这个访问对象记为a

a=requests.get(url="刚刚获得的详情页地址",headers=headers).text
a_tree=etree.HTML(a)
这里直接定位到图片的地址,a.xpath('/html/body/div[5]/div/div[2]/div/div[2]/div[1]/div[1]/a/img/@src')[0]

既然,我们已经得到了图片的url,那么就可以解析,获得图片了

img_data=requests.get(url="图片的地址",headers=headers).content

接下来就是永久存储(这里注意,图片保存是二进制的,那么就要用wb)
with open(“存放位置”,“wb”) as f:
f.write(img_data)

此时,思路已经完成。但是!!!!!!!!
我们发现一个问题,图片我是得到了,但是只是一张,我想把这些都获取怎么办?在这里插入图片描述

不妨看看,第一张图片详情页的网址与第二章详情页的网址有什么不同吧
第一张的详情页网址
http://www.win4000.com/wallpaper_detail_176558.html
第二张的详情页网址
http://www.win4000.com/wallpaper_detail_176558_2.html
后面多了个"_2",那是不是我只要把详情页的地址加上“_2”就跳到了第二张图片。

这时,又有问题啦,”_detail_176558“这个数字,每个系列的图片可不一样啊,这该怎么往后面加"_2"啊
这个时候就要用想,我们是在“.html”前面加上这个"_2",那么根据python字符串的操作就可以解决这个问题了吧

这样一来,是不是没有问题了??????

还没结束哦,又有问题了!!我怎么知道这个标签下有多少张图片啊,大家看图片详情页
在这里插入图片描述
我们只要获得这个”10“,再来一波for循环,岂不起飞

感谢各位能看到这里,我把我写的原码放在下面

#-*-coding:utf-8-*-
import requests
from lxml import etree
import os

if __name__=="__main__":
    if not os.path.exists("../学习资料(终极不改版)"):
        os.mkdir("../学习资料(终极不改版)")

    headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 SLBrowser/6.0.1.9171"}
    # 系列图片的网址
    for j in range(1,6):
        url=F"http://www.win4000.com/meinvtag10231_{j}.html"

        all_page=requests.get(url=url,headers=headers).text

        tree=etree.HTML(all_page)
        a_list=tree.xpath('//div[@class="list_cont Left_list_cont  Left_list_cont2"]/div[2]//ul[@class="clearfix"]/li/a/@href')
        # a_list保存的每张系列图片的第一张
        """
         a_url就是系列图的第一张的图片地址
         比如第一张:http://www.win4000.com/meinv217039.html
         我们还要获得“极品美女粉色蕾丝裹胸裙性感撩人写真(1/15)”中的15来进行for循环
        """
        for a_url in a_list:
            img_page=requests.get(url=a_url,headers=headers).text

            tree1=etree.HTML(img_page)
            how_many=tree1.xpath('//div[@class="meinv-content clearfix"]/div[@class="Bigimg"]//em/text()')[0]
            # serise_name=tree1.xpath('//div[@class="meinv-content clearfix"]/div[@class="Bigimg"]//h1/text()')[0]
            how_many=int(how_many)
            # serise_name="".join(serise_name)

            for i in range(1, how_many + 1):
                a_url_str = "".join(a_url)
                a_url_list = list(a_url_str)
                index=a_url_str.rfind(".")
                a_url_list.insert(index,F"_{i}")
                img_page_src="".join(a_url_list)

                img_page_data=requests.get(url=img_page_src,headers=headers).text

                img_tree=etree.HTML(img_page_data)
                img_src=img_tree.xpath('//div[@class="meinv-content clearfix"]//div[@class="pic-meinv"]/a/img[@class="pic-large"]/@url')[0]
                img_data=requests.get(url=img_src,headers=headers).content
                name=img_src.split("/")[-1]
                img_name = name + F"({i}_{how_many}).jpg"
                img_path = "../学习资料(终极不改版)/" + img_name
                with open(img_path, 'wb') as f:
                    f.write(img_data)
                    print(F"{img_name}\t下载成功!!!")

    print("下载完成!!!!!老司机起飞")

完美结束,感谢各位观看,诸位有可探讨者,欢迎指点批评,不胜感激,小白一枚,欢迎大牛指点

谢谢

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐