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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33958297/article/details/82314402

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

7.获得相应的请求头  

可以发现 需要注意的只有一个字段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.结果:

猜你喜欢

转载自blog.csdn.net/qq_33958297/article/details/82314402