欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python爬虫实战之爬取网站全部图片(一)

程序员文章站 2022-05-27 08:47:39
...

通过python 来爬取网站内所有的图片到本地  

这个网站的内容比较好操作 因为所有的请求都是同步的 不存在操作js  后面的文章中会讲到如何对ajax操作的请求进行抓取 

其实反而他如果用ajax请求 我们操作起来还简单了 最起码不用写这么多代码了

而且这套代码也使用的最为暴力的方式 直接requests.get或者requests.post  后面的文章中会采用Session保持回话的方式进行操作

爬取网址: http://www.meizitu.com/a/more_1.html

一.获得图片地址 和 图片名称

Python爬虫实战之爬取网站全部图片(一)

1.进入网址之后 按F12  打开开发人员工具点击elemnts

Python爬虫实战之爬取网站全部图片(一)

 2.点击下图的小箭头 选择主图中的任意一个图片   那我们这里点击第一个 图片

Python爬虫实战之爬取网站全部图片(一)

   3.显示控制台 为了验证xpath是否正确

Python爬虫实战之爬取网站全部图片(一)

 

    4.通过xpath获得a的href  和 title.

Python爬虫实战之爬取网站全部图片(一)

(请放大看)我们看到 他提示的是有10个 我们回到网站中看一下  在主页上数一下 他确实是10个 也就是说 我们获得的href 和title是没有任何问题的 那么留着为我们后面使用.

    5.我们还需要访问这个链接的请求头的信息 以备后面操作的时候来使用

Python爬虫实战之爬取网站全部图片(一)

这里可以看到 没有什么特别的请求头

6.获得每套图里的 所有图片.这也是我们的目的所在 不然前面那么多工序不是浪费吗。

Python爬虫实战之爬取网站全部图片(一)

可以看到 我们获得了11个链接地址   不要被源码中的文字所迷惑

 

7.获得相应的请求头  

Python爬虫实战之爬取网站全部图片(一)

可以发现 需要注意的只有一个字段Referer 这里的地址就是我们访问这个页面进来的时候的那个地址 只要把那个地址给上就行了

8.对于404的处理 如果出现了404那就只有重新请求了

 

二.编写python代码实现爬取.

    1.需要用到的库有: 

      Requests   lxml    如果没有安装的请自己安装一下

    2.IDE : pycharm

    3.python 版本: 2.7.15

    4.代码实现的是多线程下载,多线程的好处 就不用我多说了。

import requests
import os
from lxml import etree
from threading import *
from time import sleep

nMaxThread = 3  #这里设置需要开启几条线程
ThreadLock = BoundedSemaphore(nMaxThread)

gHeads = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}

class Meizitu(Thread):
    def __init__(self,mainReferer,url,title):
        Thread.__init__(self)
        self.MainReferer = mainReferer  
        self.url = url
        self.title = title[3:-4]  #这里是为了把<b></b>给删除

    def run(self):
        try:
            urlList = self.GetPhotoUrl()
            if len(urlList) > 0 and urlList != None:
                self.SavePath(urlList)
            
        finally:
            ThreadLock.release()

    def GetPhotoUrl(self):
        heads={
            "Referer":self.MainReferer
        }
        heads.update(gHeads)
        html = requests.get(self.url,headers=heads)
        if html.status_code == 200:
            xmlContent = etree.HTML(html.text)
            urlList = xmlContent.xpath("//div[@id='picture']/p/img/@src")
            return urlList
        else:
            return None

    def SavePath(self,urlList):
        heads = {
            "Referer": self.url
        }
        heads.update(gHeads)
        savePath = "./photo/%s" % self.title
        if not os.path.exists(savePath):
            os.makedirs(savePath)
        for i in range(len(urlList)):
            j = 0
            while j<5:
                print "Download : %s/%d.jpg" % (self.title.encode("gbk"), i + 1)
                html = requests.get(urlList[i],headers=heads)
                if html.status_code == 200:
                    with open(savePath + "/%d.jpg"%(i+1),"wb") as f:
                        f.write(html.content)
                    break
                elif html.status_code == 404:
                    j+=1
                    sleep(0.05)
                    continue
                else:
                    return None


def main():
    while True:
        try:
            nNum = int(raw_input("请输入要下载几页: "))
            if nNum>0:
                break
        except ValueError:
            print("请输入数字。")
            continue
    for i in range(nNum):
        url = "http://www.meizitu.com/a/more_%d.html"%(i+1)
        html = requests.get(url,headers=gHeads)
        if html.status_code == 200:
            xmlContent = etree.HTML(html.content)
            hrefList = xmlContent.xpath("//div[@class='pic']/a/@href")
            titleList = xmlContent.xpath("//div[@class='pic']/a/img/@alt")
            for i in range(len(hrefList)):
                ThreadLock.acquire()
                t = Meizitu(url,hrefList[i],titleList[i])
                t.start()


if __name__ == '__main__':
    main()

5.结果:

Python爬虫实战之爬取网站全部图片(一)