python3吧_基于python3 抓取贴吧图片与评论 图片下载保存
抓取百度贴吧
目标:
1、获取帖子标题、总页数、评论、图片
2、图片写入文件并保存
3、将各种信息实现打印(测试追踪)
4、输入帖子号便能实现以上操作(亦适用于其它帖子)
第一版:
# -*-coding:utf-8-*-
import random
import re
import os
import urllib
import requests
import urllib.request
import time
from PIL import Image
from io import BytesIO
from bs4 import BeautifulSoup
"""初始化查询的网址"""
siteURL = "http://tieba.baidu.com/p/"
def replace(x):
"""
方便用replace方法把换行符等删除
:param: x
:return: x.strip
"""
# 将list 转化为字符串 否则报错expected string or bytes-like object
x = ''.join(x)
removeImg = re.compile('|{7}| ') # 去除img标签,1-7位空格,
removeAddr = re.compile('|') # 删除超链接标签
replaceLine = re.compile('
|
|') # 把换行的标签换位\n
replaceTD = re.compile('
') # 把表格制表换为\t
replaceBR = re.compile('
|
||') # 把换行符或者双换行符换为\n
removeExtraTag = re.compile('.*?') # 把其余标签剔除
removeNoneLine = re.compile('\n+') # 把多余空行删除
removeNoneLine = re.compile('\n+') # 把多余空行删除
x = re.sub(removeImg, "", x)
x = re.sub(removeAddr, "", x)
x = re.sub(replaceLine, "\n", x)
x = re.sub(replaceTD, "\t", x)
x = re.sub(replaceBR, "\n", x)
x = re.sub(removeExtraTag, "", x)
x = re.sub(removeNoneLine, "\n", x)
return x.strip() # 把strip()前后多余内容删除
def getSource(url):
"""
获取网页源码
:param: url
:return: result
"""
user_agents = [
'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \(KHTML, like Gecko) Element Browser 5.0',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',
'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \Version/6.0 Mobile/10A5355d Safari/8536.25',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \Chrome/28.0.1468.0 Safari/537.36',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)'
]
length = len(user_agents) - 1
print(length)
index = random.randint(0, length)
user_agent = user_agents[index]
headers = {'User_agent': user_agent}
r = requests.get(url, headers=headers)
return r.text
def saveImage(imageURL, path, title, name, pageName):
"""
保存图片写入文件
:param: imageURL, path, title, name, pageName
:return:
"""
try:
# 命名格式有问题 不能用网址命名 因为有'/' 命名格式不行 下面在做一个过滤器 下周一来搞
# 解决方案 在调用前传入名称就好
proDir = os.path.split(os.path.realpath(__file__))[0]
fileName = name + '.' + 'jpg'
filePath = os.path.join(proDir, "photo", title, path, pageName)
urllib.request.urlretrieve(imageURL, filePath + fileName)
# urllib.request.urlretrieve(imageURL, filePath)
# urllib.request.urlretrieve(imageURL, filePath + '\\%s.jpg' % imageURL)
except Exception as e:
print(e)
def getTitle(url):
"""
获取帖子的标题,并打印输出
:param: url
:return: iteam
"""
result = getSource(url)
pattern = re.compile('
(.*?)', re.S)
iteam = re.findall(pattern, result)
text = replace(iteam)
print(u'这篇文章的标题为------' + text)
return text
def getPageNumber(url):
"""
获取该帖子的总页数,并打印输出
:param: url
:return:iteams
"""
result = getSource(url)
soup = BeautifulSoup(result, 'lxml')
# pattern = re.compile('
# 若存在多个pattern子串 只返回第一个
# iteams = re.findall(pattern, result)
iteams = soup.find_all('span', attrs={'class': 'red'})
iteam = iteams[-1].get_text()
print(iteam)
page = replace(iteam)
print(u'这篇文章的总页数为------' + page)
return page
def getContent(url):
"""
获取评论
:param: url
:return:items
"""
result = getSource(url)
pattern = re.compile('(.*?).*?
创建目录
:param: path,title
:return: path
"""
# 获取 proDir 主路径
proDir = os.path.split(os.path.realpath(__file__))[0]
# filePath 配置文件路径地址
filePath = os.path.join(proDir, "photo", title)
# strip() 作用是去掉换行符之类的
# 为每一页创建路径
path = path.strip()
# os.path.exists() 用来检查路径是否存在 false true
E = os.path.exists(os.path.join(filePath, path))
if not E:
# 创建新目录,若想将内容保存至别的路径(非系统默认),需要更环境变量 os.makedir如果子目录创建失败或者已经存在
# 更改环境变量用os.chdir() 切换路径
os.makedirs(os.path.join(filePath, path))
os.chdir(os.path.join(filePath, path))
print(u'正在创建名为', path, u'的文件夹')
return path
else:
print(u'名为', path, u'的文件夹已经存在...')
return path
def getImage(url):
"""
获取晒图,清洗获得链接并保存入list
:param: url
:return: images
"""
result = getSource(url)
soup = BeautifulSoup(result, 'lxml')
# 此处用BeautifulSoup显然更高效
# find_all()返回一个list,find()返回一个元素
# 注意class属性和python内置的重合,所以加_变成class_
# items = soup.find_all('img', class_="BDE_Image")
items = soup.find_all('img', attrs={'class': 'BDE_Image'})
images = []
number = 0
for item in items:
print(u'发现一张图,链接为------', item['src'])
images.append(item['src'])
number += 1
if number >= 1:
print(u'\n', u'共晒图', number, u'张,厉害了我的哥!!!')
else:
print(u'喏,没有图......')
return images
def getAllPage(Num, siteURL=siteURL):
"""
:param: Num,siteURL
:return:
"""
siteURL = siteURL + str(Num)
# 获取帖子标题
title = getTitle(siteURL)
# 获取帖子页数
numbers = getPageNumber(siteURL)
# 浏览全部页面
for page in range(1, int(numbers) + 1):
# 格式化索引链接
url = siteURL + '?pn=' + str(page)
print(u'\n\n', u'正准备获取第', page, u'页的内容...')
# 获取评论
print(u'\n', u'正准备获取评论...')
getContent(url)
# 保存图片
# 每一页创建一个文件 page1 page2 page3
path = makeDir(path='page' + str(page), title=title)
# 获取图片
print(u'\n', u'正准备获取图片...')
images = getImage(url)
print(images)
print(u'\n', u'正准备保存图片...')
number = 1
# 保存图片,先从之前的list中找链接
for detailURL in images:
pageName = str(page) + str(number)
name = 'page' + str(page) + 'num' + str(number)
saveImage(detailURL, path, title, name, pageName)
time.sleep(0.1)
number += 1
print(u'\n\n', u'完成第', page, u'页'
)
print(u'\n\n', u'恭喜,圆满成功!')
def main():
"""主函数 Num填写帖子号 打开帖子查看网址最后一串数字"""
Num = 4252370485
items = getAllPage(Num)
if __name__ == "__main__":
main()
优化之后 删除一些重复的东西
'''
抓取百度贴吧(优化)
目标:
1、获取帖子标题、总页数、评论、图片
2、图片写入文件并保存
3、将各种信息实现打印(测试追踪)
4、输入帖子号便能实现以上操作(亦适用于其它帖子)
'''
# -*-coding:utf-8-*-
import random
import re
import os
import urllib
import requests
import urllib.request
import time
from bs4 import BeautifulSoup
"""初始化查询的网址"""
siteURL = "http://tieba.baidu.com/p/"
def replace(x):
"""
方便用replace方法把换行符等删除
:param: x
:return: x.strip
"""
# 将list 转化为字符串 否则报错expected string or bytes-like object
x = ''.join(x)
removeImg = re.compile('|{7}| ') # 去除img标签,1-7位空格,
removeAddr = re.compile('|') # 删除超链接标签
replaceLine = re.compile('
|
|') # 把换行的标签换位\n
replaceTD = re.compile('
') # 把表格制表换为\t
replaceBR = re.compile('
|
||') # 把换行符或者双换行符换为\n
removeExtraTag = re.compile('.*?') # 把其余标签剔除
removeNoneLine = re.compile('\n+') # 把多余空行删除
x = re.sub(removeImg, "", x)
x = re.sub(removeAddr, "", x)
x = re.sub(replaceLine, "\n", x)
x = re.sub(replaceTD, "\t", x)
x = re.sub(replaceBR, "\n", x)
x = re.sub(removeExtraTag, "", x)
x = re.sub(removeNoneLine, "\n", x)
return x.strip() # 把strip()前后多余内容删除
def getSource(url):
"""
获取网页源码
:param: url
:return: result
"""
# 设置18个浏览头 防止重复被封
user_agents = [
'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \(KHTML, like Gecko) Element Browser 5.0',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',
'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \Version/6.0 Mobile/10A5355d Safari/8536.25',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \Chrome/28.0.1468.0 Safari/537.36',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)'
]
length = len(user_agents)
# 从18个里面随机选一个 生成一个0到1的随机符点数: 0 <= n <= 17
index = random.randint(0, length-1)
user_agent = user_agents[index]
headers = {'User_agent': user_agent}
r = requests.get(url, headers=headers)
return r.text
def get_Title_Numbers(url):
"""
获取帖子的标题和总页数,并打印输出
:param: url
:return:title,page
"""
result = getSource(url)
# 下面的用正则来查找 总页数用正则查不到 因此就用了 beautifulsoup ,将两个合并在一块干脆全部使用soup吧
# pattern = re.compile('
(.*?)', re.S)
# iteam = re.findall(pattern, result)
# text = replace(iteam)
# print(u'这篇文章的标题为------' + text)
soup = BeautifulSoup(result, 'lxml')
titles = soup.find_all('h1', attrs={'class': 'core_title_txt'})
title = titles[0].get_text()
print(u'这篇文章的标题为------' + title)
pages = soup.find_all('span', attrs={'class': 'red'})
page = pages[-1].get_text()
print(u'这篇文章的总页数为------' + page)
return title, page
def makeDir(title):
"""
创建目录
:param:title
:return:filePath
缺陷:若是已经创建该文件夹 重复创建会失败 考虑下已经创建的情况(已改)
"""
# 获取 proDir 主路径
proDir = os.path.split(os.path.realpath(__file__))[0]
filePath = os.path.join(proDir, "photo", title)
# os.path.exists() 用来检查路径是否存在 false true
E = os.path.exists(filePath)
if not E:
# 创建新目录,若想将内容保存至别的路径(非系统默认),需要更环境变量 os.makedir如果子目录创建失败或者已经存在
# 更改环境变量用os.chdir() 切换路径
os.makedirs(os.path.join(filePath))
os.chdir(os.path.join(filePath))
print(u'正在创建名为', title, u'的文件夹')
return filePath+"\\"
else:
print(u'名为', title, u'的文件夹已经存在...')
return filePath+"\\"
def get_Content_Images(url, page, path):
"""
获取图片与评论,返回图片打印输出评论
:param: url, page, title
:return:
"""
result = getSource(url)
pattern = re.compile('(.*?).*?
得到全部页面
:param: Num,siteURL
:return:
"""
siteURL = siteURL + str(Num)
# 获取帖子标题和页数可以合并为一个
title, numbers = get_Title_Numbers(siteURL)
# 创建文件夹
path = makeDir(title)
# 浏览全部页面 从第一页开始到最后一页
for page in range(1, int(numbers) + 1):
# 格式化索引链接 查看方法 看URL地址,找规矩
url = siteURL + '?pn=' + str(page)
print(u'\n\n', u'正准备获取第', page, u'页的内容...')
# 获取评论 Because每一页都不同 So都要重新 getSource(url) 可以将获取图片和评论两个结合在一块
get_Content_Images(url, page, path)
print(u'\n\n', u'恭喜,圆满成功!')
def shuru():
"""
输入函数
:param:
:return: x
"""
print("请输入百度贴吧的帖子号:")
x = input("请输入......")
return x
def main():
"""主函数 Num填写帖子号 打开帖子查看网址最后一串数字"""
# 4252370485
Num = 4252370485
items = getAllPage(Num)
if __name__ == "__main__":
main()
python3吧_基于python3 抓取贴吧图片与评论 图片下载保存相关推荐
- python抓取dblp网站的arXiv论文,下载保存成pdf
python抓取dblp网站的arXiv论文,下载保存成pdf 需求 需要查找一些关于强化学习决策方面的论文,懒得一个一个下载,所以用python写了个脚本,在dblp网站上爬取论文. import ...
- python新闻评论分析_使用 python 抓取并分析京东商品评论数据
本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...
- python3爬取网易云歌单数据清洗_网页抓取网易云音乐及评论数据分析
网页抓取网易云音乐及评论数据分析 游贤 成都理工大学信息科学与技术学院 [摘 要] 摘要:为了分析网易云音乐中哪些歌曲是热门歌曲,哪些歌曲的评论 最多,从而了解到人们对于不同音乐类型的喜爱程度,采用成 ...
- python3一个简单的网页抓取
python3一个简单的网页抓取 都是学PYTHON.怎么学都是学,按照基础学也好,按照例子增加印象也好,反正都是学 import urllib import urllib.requestdata={ ...
- Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证
配置一下"可能需要修改的参数",就可以食用底部代码了,ps:可能已失效 本文章代码功能 准备工作 Python用到的库和准备工作 可能需要修改的参数 在CMD中打开一个Chrome ...
- CasperJS基于PhantomJS抓取页面
CasperJS基于PhantomJS抓取页面 Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的 JavaScript API 的 WebKit. CasperJS是 ...
- python抓取经典评论_通过Python抓取天猫评论数据
每日干货好文分享丨请点击+关注 对商业智能BI.数据分析挖掘.大数据.机器学习感兴趣的加微信tsbeidou,邀请你进入交流群. 欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析 ...
- python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存
原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...
- 利用wget 抓取 网站网页 包括css背景图片
利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...
- c语言抓取抖音视频,【FiddlerScript】利用Fiddler中的FiddlerScript自动抓取抖音无水印视频并且自动保存...
本帖最后由 小白大侠 于 2021-3-14 13:55 编辑 Fiddler自动抓取抖音无水印视频并且自动保存 前言:这段代码实用性不大,大量数据处理容易造成Fiddler卡死,只是希望给未来写Fi ...
最新文章
- 【OpenStack】OpenStack系列1之Python虚拟环境搭建
- 求数列的和 AC 杭电
- Thread 小总结
- android api接口封装,生成App接口
- 消息队列之JMS和AMQP对比
- the pdf expert for android v2.6.0,PDF Expert
- UnrealEngine4和3DMax的配合_准备资源
- Vue音乐项目笔记(三)
- Javaの网络数据传输之Socket
- Python如何在函数外部调用函数内部的变量
- 帆软通过js删除数据库表中的数据
- 木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖
- 微信定位精灵服务器或网络异常,微信定位精灵系统界面无法更新怎么办
- Elastalert的报警功能拓展:分组报警
- 怎样获得元气骑士的损坏的机器人_元气骑士损坏的机器人怎么修复?机器人修复方法...
- 自动驾驶车辆控制(坐标转换与横向积分误差)
- AsyncLoadLocalImage ios 加载本地高清大图
- Mac使用技巧之如何禁用独立显卡
- 4个小例子告诉你:如何成为一名数据极客
- 【《自动控制原理(田玉平)》|课本知识点整理(一)】第 2 章 控制系统的输入 - 输出模型