Python爬虫02——贴吧图片爬虫V2.0

Python小爬虫——贴吧图片爬虫V2.0

贴吧图片爬虫进阶:在上次的第一个小爬虫事后,用了几回发现每爬一个帖子,都要本身手动输入帖子连接,WTF这程序简直反人类!不行了不行了得改进改进html


 

  思路:  

  • 贴吧的连接能够从每一个贴吧首页爬取
  • 再从爬取到的贴吧连接中一个个去下载图片
  • 图片得按帖子放置好,否则就太乱了

在这期间研究了下Xpath:python

Xpath是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。正则表达式

简单点来讲就是能让你的爬虫经过标签的id、class、name等属性能够获取到标签的属性或内容的一门语言,就不用去写讨厌的正则表达式了(刚开始用正则人都要炸了)学习

Xpath的学习视频呢,在这里--->Gourl

固然其实用re也能实现,废话也很少说了,开始正题了spa


 

  帖子连接的爬取:  

咱们的目标固然是:壁纸吧、萌妹子、爆照吧等等等等线程

做为一个绅士仍是以壁纸吧来作示范吧:http://tieba.baidu.com/f?kw=%E5%A3%81%E7%BA%B8&ie=utf-8code

打开壁纸吧视频

 经过右键检查、或是查看源码找到每一个帖子的标签xml

帖子的标签在这里

<a href="/p/4686986115" title="【壁纸】江湖多风雨,天下已入秋" target="_blank" class="j_th_tit ">【壁纸】江湖多风雨,天下已入秋</a>

应该就是href后面的哪一个 "/p/4686986115" 了

点进去果真,就是在前面多了串 http://tieba.baidu.com 

OK!那把连接爬取出来就至关容易了:

from lxml import etree

def getArticleLinks(url):
    html = requests.get(url)
    Selector = etree.HTML(html.text)
    # 经过Xpath 获取每一个帖子的url后缀
    url_list = Selector.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')
    # 在每一个后缀前加上百度贴吧的url前缀
    for i in range(len(url_list)):
        url_list[i] = 'http://tieba.baidu.com' + url_list[i]
    return url_list

 


  图片按文件夹下载:  

 先是一个帖子的图片下载:

def get_img(url):
    html = requests.get(url)
    # 这里用Xpath或者以前的re拿到img_url_list
    Selector = etree.HTML(html.text)
    img_url_list = Selector.xpath('//*[@class="BDE_Image"]/@src')
    pic_name = 0
    # 下载图片
    for each in img_url_list:
        urllib.urlretrieve(each, 'pic_%s.jpg' % pic_name)
        pic_name += 1

其实这样已经差很少了,再来个循环每一个帖子连接来一次 get_img 就能够获取到全部的图片,可是这样的话:

  1. 那么多帖子的图片在一块儿很乱
  2. 下一个帖子的图片会把上一个帖子图片覆盖(由于都是pic_00.jpg开始的,且都在一个文件夹内)

个人想法是建一个downloads文件夹,而后在里面按帖子分文件夹存放下载下来的图片

# 该目录下建立一个downloads文件夹存放下载图片
    if not os.path.exists('downloads'):
        os.mkdir('downloads')

固然是没有的时候创建,有的话就能够不用了

而后按帖子分文件夹

# 这里把帖子url的后缀做为文件夹名,由于不能有'/'因此把它替换成了''
img_dir = 'downloads/' + url_list[i][23:].replace("/", '')
        if not os.path.exists(img_dir):
            os.mkdir(img_dir)

而后就能够下载了:

def download_img(url_list):
    if not os.path.exists('downloads'):
        os.mkdir('downloads')
    for each in url_list:
        img_dir = 'downloads/' + each[23:].replace("/", '')
        if not os.path.exists(img_dir):
            os.mkdir(img_dir)
        get_img(each)

然而并无一个个图片按帖子放好,文件夹是建好了。

通过研究发现,应该在 get_img 以前应该先把当前目录改成要放的文件夹目录下

 os.chdir(path) 能够用来改变python当前所在的文件夹

而后在下载完一个帖子后得移回当前目录,最后的代码就是:

def download_img(url_list):
    # 该目录下建立一个downloads文件夹存放下载图片
    if not os.path.exists('downloads'):
        os.mkdir('downloads')
    root_path = os.getcwd()
    for each in url_list:
        img_dir = 'downloads/' + each[23:].replace("/", '')
        if not os.path.exists(img_dir):
            os.mkdir(img_dir)
        os.chdir(img_dir)
        get_img(each)
        os.chdir(root_path)

啪啪啪啪啪[完美]


 

  交互:  

 老样子和以前的第一个小爬虫同样,添加一些交互。

不过我发现,一个贴吧第一页的帖子也贼多,而后因为爬虫暂时仍是单线程的

因此如果要将整个第一页爬完,也是要花挺多时间,就稍微修改了下,加了一个帖子个数的输入

最终的代码:

# coding:utf-8
import requests
import os
import urllib
import re
from lxml import etree

# 经过url获取每一个帖子连接
def getArticleLinks(url):
    html = requests.get(url)
    Selector = etree.HTML(html.text)
    # 经过Xpath 获取每一个帖子的url后缀
    url_list = Selector.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')
    # 在每一个后缀前加上百度贴吧的url前缀
    for i in range(len(url_list)):
        url_list[i] = 'http://tieba.baidu.com' + url_list[i]
    return url_list

# 经过所给帖子连接,下载帖子中全部图片
def get_img(url):
    html = requests.get(url)
    Selector = etree.HTML(html.text)
    img_url_list = Selector.xpath('//*[@class="BDE_Image"]/@src')
    pic_name = 0
    for each in img_url_list:
        urllib.urlretrieve(each, 'pic_%s.jpg' % pic_name)
        pic_name += 1

# 为每一个帖子建立独立文件夹,并下载图片
def download_img(url_list,page):
    # 该目录下建立一个downloads文件夹存放下载图片
    if not os.path.exists('downloads'):
        os.mkdir('downloads')
    root_path = os.getcwd()
    for i in range(page):
        img_dir = 'downloads/' + url_list[i][23:].replace("/", '')
        if not os.path.exists(img_dir):
            os.mkdir(img_dir)
        os.chdir(img_dir)
        get_img(url_list[i])
        os.chdir(root_path)

if __name__ == '__main__':
    print u'-----贴吧图片爬取装置2.0-----'
    print u'请输入贴吧地址:',
    targetUrl = raw_input('')
    if not targetUrl:
        print u'---没有地址输入正在使用默认地址(baidu壁纸吧)---'
        targetUrl = 'http://tieba.baidu.com/f?kw=%E5%A3%81%E7%BA%B8&ie=utf-8'

    page = ''
    while True:
        print u'请输入你要下载的帖子数:',
        page = raw_input('')
        if re.findall(r'^[0-9]*[1-9][0-9]*$',page):
            page = int(page)
            break
    print u'----------正在下载图片---------'
    ArticleLinks = getArticleLinks(targetUrl)
    download_img(ArticleLinks,page)
    print u'-----------下载成功-----------'
    raw_input('Press Enter to exit')

界面:

不要脸的说自我感受良好23333

结构是这样滴

 内容(爬取的内容怎么和我不同?我无论23333)

 # 结尾的啪啪啪啪啪

相关文章
相关标签/搜索