获取贴吧图片的python爬虫

293 查看

经过前两篇文章 http://segmentfault.com/a/1190000004288204http://segmentfault.com/a/1190000004269037的测试,决定实现以下功能:

  1. 给定感兴趣的贴吧首页,自动获取帖子的链接

  2. 进入获取到的链接中,将帖子内的图片链接提取出来

  3. 按照帖子的ID建文件夹,将帖子内图片的链接下载为图片保存到文件夹中

实现过程:

获取帖子列表
以百度贴吧“壁纸吧”为例http://tieba.baidu.com/f?kw=%E5%A3%81%E7%BA%B8&ie=utf-8,通过分析该网页源代码,发现:

每一个帖子的链接都是

href="/p/xxxxxxxxxx"

再打开对应帖子的链接,发现该帖子正是

http://tieba.baidu.com/p/xxxxxxxxx

所以获取文章链接的思路很简单:
获取到标题的href这个属性的内容,前面加上http://tieba.baidu.com/就是最终的帖子链接:

LinkSelector = AirticleFilter.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')

获取帖子中每个楼层所包含的图片链接:
这里会有一个坑,如果你直接从chrome中审查元素,定位到图片所在的xpath,有可能是获取不到真正的链接的,而有可能获取到“loading.gif”!这是因为,图片在加载时比较慢,网页先下载一个小的动画图片显示loading,待下载完成之后再显示真正的图片。不过好在在每一个包含图片的楼层中的头部信息中都包含了文件的类型,图片的大小,图片的链接地址,以及图片是否为用户上传的图片等信息:

经过摸索,我们要提取的是包含有<img class="BDE_Image">的节点信息,该节点中有图片的实际链接src="http:\\XXXXXXXX"

BackGroundLink = BackGroundFilter.xpath('//div[@class="l_post l_post_bright j_l_post clearfix  "]')
ImgSrc = etree.HTML(reply_info['content']['content'])
ImgLink = ImgSrc.xpath('//img[@class="BDE_Image"]/@src')

以上xpath首先获取到楼层,然后获取到楼层中的content信息,然后将content信息作为html文件再次分析,获取到包含class="BDE_Image"的图片的src。

根据帖子ID建立文件夹
建立文件夹可以使用os库的mkdirs方法,注意,如果是mkdir方法则只能创建一层目录。

def MakeDir(TargetDir,FolderName):
    new_path = os.path.join(TargetDir,FolderName)
    if(not os.path.isdir(new_path)):
        os.makedirs(new_path)
    os.chdir(new_path)

最终代码:

#-*-coding:utf8-*-
from lxml import etree
import SaveLinkIntoFile
import requests
import re
import os
import GetTiebaImg

def GetArticleLinks(url):
    TiebaUrlprefix = 'http://tieba.baidu.com'
    html = requests.get(url)
    html = re.sub(r'charset=(/w*)', 'charset=UTF-8', html.text)
    AirticleFilter = etree.HTML(html)
    #print(html)
    LinkSelector = AirticleFilter.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')
    for i in range(len(LinkSelector)):
        foldername = LinkSelector[i].strip().lstrip().rstrip('/').replace('/','')
        print(foldername)
        MakeDir("D:\Python_Cache",foldername)
        LinkSelector[i] = TiebaUrlprefix + LinkSelector[i]
        GetTiebaImg.GetTiebaImg([LinkSelector[i]])
        os.chdir("../")

    print(LinkSelector)
    return LinkSelector
    # print("the number of links:{0}".format(len(LinkSelector)))
    # for each in LinkSelector:
    #     print("The links:{0}".format_map(each[0]))

def MakeDir(TargetDir,FolderName):
    new_path = os.path.join(TargetDir,FolderName)
    if(not os.path.isdir(new_path)):
        os.makedirs(new_path)
    os.chdir(new_path)
    # print("the Current dir is:{0}".format(os.getcwd()))
    # os.chdir("../")
    # print("the Current dir is:{0}".format(os.getcwd()))


if __name__ == '__main__':
    MakeDir("D:\Python_Cache","Cache1")
    TiebaUrl = 'http://tieba.baidu.com/f?kw=%E5%A3%81%E7%BA%B8&ie=utf-8'
    GetArticleLinks(TiebaUrl)
    

运行效果: