获取贴吧图片的python爬虫
admin
2023-07-31 01:44:10
0

经过前两篇文章 http://segmentfault.com/a/1190000004288204 和 http://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,待下载完成之后再显示真正的图片。不过好在在每一个包含图片的楼层中的头部信息中都包含了文件的类型,图片的大小,图片的链接地址,以及图片是否为用户上传的图片等信息:

经过摸索,我们要提取的是包含有的节点信息,该节点中有图片的实际链接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)
    

运行效果:

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...