爬虫入门(一)

来源:互联网 发布:爱易编程工具箱 编辑:程序博客网 时间:2024/06/12 21:42

爬虫入门(一)

说起爬虫呢其实网上非常多教程,非常好玩,还能顺便练习一下python,但是呢要维护好一个高效,稳定的爬虫不是一件容易的事噢,本人也是初学者,写一些自己的学习心得,以防以后老年痴呆= =

环境是ubuntu16.04,python3.6.1

在某乎上看到的一个爬虫教程的帖子推荐了一个福利的网站,那我们也先从这个网站开始吧 http://www.mzitu.com 我就不截图了,友情提醒,自备营养快线

进去这个网站之后别光顾着看妹子图,我们可以先到处点点,比如翻页,会看到网站从mzitu.com 变为 mzitu.com/page/2,点进去的套图翻页也是类似原网站后面加个/数字,先记住这个规律,后面显然有用嘛

我们打开网页的检查元素,比如chrome就是快捷键F12,查看网页的源代码,比如我们想看第一个套图,那么我们鼠标右键这个图片,可以看到呢

1

请留意我鼠标选中蓝色的这里,标签a的属性href里面的这个网址,我们可以尝试点进去,就会发现呢这其实就是进去套图之后的地址嘛,然后我们继续尝试第二个图片,同样的里面属性的这个网址就是这个套图的入口地址,并且我们可以发现,这个网站很良心,把主页上的所有图片都是在<li>下有顺序排好的,好了,那么有了这个分析基础,我们就可以先写一段程序来获取主页上所有的入口地址吧

import requestsfrom lxml import htmlimport osimport timeclass mzitu():    base_url = 'http://www.mzitu.com'    jpg_download_list = []    ##获取主页下所有套图的入口,默认从第一页开始    def getAllPage_location(self,num=1):        print(u'开始获取第%s页套图入口地址'%(str(num)))        jpg_location = []        now_url = '{}/page/{}'.format(self.base_url,num)        selector = html.fromstring(requests.get(now_url).text)        for loc in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):            jpg_location.append(loc)        print(u'第%s页套图入口地址获取完成'%(str(num)))        return jpg_location

这里呢我用的是requests库和xpath语法来获取,可以自行测试一下看看是否入口地址都爬取成功

2

打印出来之后自己点击一下发现的确可以了,那么我们第一步就成功了,接下来呢我们就要进入到套图里面,分析里面的图片,同样的我们右键一下图片看看

3

大致翻一下可以知道,标题和图片下载地址都尽在眼前了,然后我们看看怎么获取这套图的图片数呢,我们可以右键最后一页看看代码,发现其实就是在倒数第二个<a>下的<span>中嘛,那么我们就可以通过程序来获取图片的下载地址了

##获取套图下的图片的详细信息,包括标题,图片总数,下载地址def getAllJpg_Info(self,url):    print(u'开始获取图片下载地址')    del self.jpg_download_list[:]     ##图片下载地址    selector = html.fromstring(requests.get(url).text)    title = selector.xpath('//div[@class="main"]/div[@class="content"]/h2/text()')[0]    total = selector.xpath('//div[@class="pagenavi"]/a[last()-1]/span/text()')[0]    for jpgpage in range(1,int(total)+1):        now_url = '{}/{}'.format(url,jpgpage) #翻页        selector = html.fromstring(requests.get(now_url).text)        print(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0])        self.jpg_download_list.append(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0])    return title,total

这段程序呢就把图片的下载地址全部放在jpg_download_list里面了,并且我们返回一个二元组,标题和图片数供以后使用,我们打印看看是不是都在jpg_download_list里面了,嗯可以看到自己身体的营养在流失了

4

好了图片的地址都有了,那我们下一步当然是download到自己的电脑里慢慢看了是吧,代码比较简单,主要是文件的操作

这里唯一注意的是我们前面使用requests库请求的时候返回我是把它转为.text,这里下载是要用二进制文件形式下载的,所以要返回.content格式才能正确下载

def download(self,title_total):    print(u'开始下载')    count = 1    Jpg_Num = title_total[1]    Jpg_Name = title_total[0]    dirName = '[%sP]%s'%(Jpg_Num,Jpg_Name)    dirName = '{}/{}'.format(os.path.abspath('.'),dirName)    isExists = os.path.isdir(dirName)    if isExists == True:        return False    else:        os.mkdir(dirName)        for jpg in self.jpg_download_list:            file_name = '%s/%s.jpg'%(dirName,str(count))            with open(file_name,"wb") as Jpg:                print(u'开始下载 [%s]P %s 第%s张'%(Jpg_Num,Jpg_Name,str(count)))                Jpg.write(requests.get(jpg).content)                time.sleep(0.5)            count+=1

我们运行一下看看效果

5

这样我们的第一个入门爬虫就解决了~从大体逻辑来说,我们先从主页上获得当前页面下所有套图入口的地址->分别进入每一个套图获取它所有图片所有的详细信息->下载,整个流程是比较容易理解和顺其自然的

完整代码

import requestsfrom lxml import htmlimport osimport timeclass mzitu():    base_url = 'http://www.mzitu.com'    jpg_download_list = []    ##获取主页下所有套图的入口    def getAllPage_location(self,num=1):        print(u'开始获取第%s页套图入口地址'%(str(num)))        jpg_location = []        now_url = '{}/page/{}'.format(self.base_url,num)        selector = html.fromstring(requests.get(now_url).text)        for loc in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):            jpg_location.append(loc)        print(u'第%s页套图入口地址获取完成'%(str(num)))        return jpg_location    ##获取套图下的图片的详细信息,包括标题,图片总数,下载地址    def getAllJpg_Info(self,url):        print(u'开始获取图片下载地址')        del self.jpg_download_list[:]     ##图片下载地址        selector = html.fromstring(requests.get(url).text)        title = selector.xpath('//div[@class="main"]/div[@class="content"]/h2/text()')[0]        total = selector.xpath('//div[@class="pagenavi"]/a[last()-1]/span/text()')[0]        for jpgpage in range(1,int(total)+1):            now_url = '{}/{}'.format(url,jpgpage)            selector = html.fromstring(requests.get(now_url).text)            print(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0])            self.jpg_download_list.append(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0])        return title,total    def download(self,title_total):        print(u'开始下载')        count = 1        Jpg_Num = title_total[1]        Jpg_Name = title_total[0]        dirName = '[%sP]%s'%(Jpg_Num,Jpg_Name)        dirName = '{}/{}'.format(os.path.abspath('.'),dirName)        isExists = os.path.isdir(dirName)        if isExists == True:            return False        else:            os.mkdir(dirName)            for jpg in self.jpg_download_list:                file_name = '%s/%s.jpg'%(dirName,str(count))                with open(file_name,"wb") as Jpg:                    print(u'开始下载 [%s]P %s 第%s张'%(Jpg_Num,Jpg_Name,str(count)))                    Jpg.write(requests.get(jpg).content)                    time.sleep(0.5)                count+=1    def run(self,num):        for i in self.getAllPage_location(num):            self.download(self.getAllJpg_Info(i))if __name__ == '__main__':    mz = mzitu()    mz.run(1)

当然呢你能写出这样的代码并不意味着就入门了,因为还有很多问题需要解决和探索的,接下来我会慢慢学习更新,希望有兴趣的伙伴能和我这个zz交流讨论~

0 0
原创粉丝点击