Python爬虫02——贴吧图片爬虫V2.0
Python小爬虫——贴吧图片爬虫V2.0
贴吧图片爬虫进阶:在上次的第一个小爬虫过后,用了几次发现每爬一个帖子,都要自己手动输入帖子链接,WTF这程序简直反人类!不行了不行了得改进改进。
思路:
- 贴吧的链接可以从每个贴吧首页爬取
- 再从爬取到的贴吧链接中一个个去下载图片
- 图片得按帖子放置好,不然就太乱了
在这期间研究了下Xpath:
Xpath是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
简单点来说就是能让你的爬虫通过标签的id、class、name等属性可以获取到标签的属性或内容的一门语言,就不用去写讨厌的正则表达式了(刚开始用正则人都要炸了)
Xpath的学习视频呢,在这里--->Go
当然其实用re也能实现,废话也不多说了,开始正题了
帖子链接的爬取:
我们的目标当然是:壁纸吧、萌妹子、爆照吧等等等等
作为一个绅士还是以壁纸吧来做示范吧:http://tieba.baidu.com/f?kw=%E5%A3%81%E7%BA%B8&ie=utf-8
打开壁纸吧

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

帖子的标签在这里
<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 就可以获取到所有的图片,但是这样的话:
- 那么多帖子的图片在一起很乱
- 下一个帖子的图片会把上一个帖子图片覆盖(因为都是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)

# 结尾的啪啪啪啪啪
Python爬虫02——贴吧图片爬虫V2.0的更多相关文章
- 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
所谓图片爬虫,就是从互联网中自动把对方服务器上的图片爬下来的爬虫程序.有些图片是直接在html文件里面,有些是隐藏在JS文件中,在html文件中只需要我们分析源码就能得到如果是隐藏在JS文件中,那么就 ...
- python学习笔记(接口自动化框架 V2.0)
这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...
- [py]python写一个通讯录step by step V3.0
python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...
- 重要消息:MoviePy v2.0.0.dev1预发布版本已经可以下载安装使用
☞ ░ 前往老猿Python博文目录 ░ 刚刚得知,MoviePy v2.0.0.dev1版本已经预发布,据说解决了多语言支持及TextClip等一系列Bug,大家不妨升级使用.升级指令:pip in ...
- [记录][python]python爬虫,下载某图片网站的所有图集
随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集 ...
- python scrapy版 极客学院爬虫V2
python scrapy版 极客学院爬虫V2 1 基本技术 使用scrapy 2 这个爬虫的难点是 Request中的headers和cookies 尝试过好多次才成功(模拟登录),否则只能抓免费课 ...
- python爬虫-爬取百度图片
python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...
- python写的百度图片爬虫
学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...
- Python图片爬虫
1.今天给大家介绍自己写的一个图片爬虫,说白了就是从网页自动上下载需要的图片 2.首先选取目标为:http://www.zhangzishi.cc/涨姿势这个网站如下图,我们的目标就是爬取该网站福利社 ...
随机推荐
- List去除重复的元素
有两种方法,一种是去重不带顺序的,一种是去重带顺序的. /* * 方法1: 无顺序 * Hastset根据hashcode判断是否重复,数据不会重复 */ public static Lis ...
- C++中的类继承(1) 三种继承方式
继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列8-服务总线配额
上篇博文中我们介绍了Azure ServiceBus Messaging的消息事务机制: Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务(2017 ...
- C#---------------继承和多态初步
继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 3.访问 ...
- 如何有效快速提高Java服务端开发人员的技术水平?
我相信很多工作了3-5年的开发人员都会经常问自己几个问题: 1.为什么总是感觉技术没有质的提高? 2.如何能够有效和快速的提高自身的技术水平? 3.如何进入到一个牛逼的大公司,认识牛逼的人? 这篇文章 ...
- 推送一个已有的代码到新的 gerrit 服务器
1.指定项目代码库中迭代列出全部ProductList(.git)到pro.log文件中 repo forall -c 'echo $REPO_PROJECT' | tee pro.log pro.l ...
- 【2017-04-25】winform公共控件、菜单和工具栏、Tab和无边框窗体制作
一.公共控件 1. Button 按钮 + 布局 - AutoSize 按钮尺寸自动适应里面内容的长度 - Location 位置 - Margin 控件与控件外边距 - S ...
- css3 felx布局
一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. [css] .box ...
- spine动画融合与动画叠加
spine动画融合与动画叠加 一.动画融合setMix 1.概述:两个动作之间的平滑过渡 参数duration为需要多少时间从fromAnimation过渡到toAnimation,过渡时间为动画重叠 ...
- DirectFB 之 分段动画
动画动态配置 一套素材的目录结构一般如下: 子目录中的图片名称都是以数字命名,比如,1,2, 3, 4,-- 而配置文件animation.cfg的格式如下: #width height ...