抓取百度贴吧

目标:

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('

', re.S)

# 若存在多个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 抓取贴吧图片与评论 图片下载保存相关推荐

  1. python抓取dblp网站的arXiv论文,下载保存成pdf

    python抓取dblp网站的arXiv论文,下载保存成pdf 需求 需要查找一些关于强化学习决策方面的论文,懒得一个一个下载,所以用python写了个脚本,在dblp网站上爬取论文. import ...

  2. python新闻评论分析_使用 python 抓取并分析京东商品评论数据

    本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...

  3. python3爬取网易云歌单数据清洗_网页抓取网易云音乐及评论数据分析

    网页抓取网易云音乐及评论数据分析 游贤 成都理工大学信息科学与技术学院 [摘 要] 摘要:为了分析网易云音乐中哪些歌曲是热门歌曲,哪些歌曲的评论 最多,从而了解到人们对于不同音乐类型的喜爱程度,采用成 ...

  4. python3一个简单的网页抓取

    python3一个简单的网页抓取 都是学PYTHON.怎么学都是学,按照基础学也好,按照例子增加印象也好,反正都是学 import urllib import urllib.requestdata={ ...

  5. Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证

    配置一下"可能需要修改的参数",就可以食用底部代码了,ps:可能已失效 本文章代码功能 准备工作 Python用到的库和准备工作 可能需要修改的参数 在CMD中打开一个Chrome ...

  6. CasperJS基于PhantomJS抓取页面

    CasperJS基于PhantomJS抓取页面 Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的 JavaScript API 的 WebKit. CasperJS是 ...

  7. python抓取经典评论_通过Python抓取天猫评论数据

    每日干货好文分享丨请点击+关注 对商业智能BI.数据分析挖掘.大数据.机器学习感兴趣的加微信tsbeidou,邀请你进入交流群. 欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析 ...

  8. python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存

    原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...

  9. 利用wget 抓取 网站网页 包括css背景图片

    利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...

  10. c语言抓取抖音视频,【FiddlerScript】利用Fiddler中的FiddlerScript自动抓取抖音无水印视频并且自动保存...

    本帖最后由 小白大侠 于 2021-3-14 13:55 编辑 Fiddler自动抓取抖音无水印视频并且自动保存 前言:这段代码实用性不大,大量数据处理容易造成Fiddler卡死,只是希望给未来写Fi ...

最新文章

  1. 【OpenStack】OpenStack系列1之Python虚拟环境搭建
  2. 求数列的和 AC 杭电
  3. Thread 小总结
  4. android api接口封装,生成App接口
  5. 消息队列之JMS和AMQP对比
  6. the pdf expert for android v2.6.0,PDF Expert
  7. UnrealEngine4和3DMax的配合_准备资源
  8. Vue音乐项目笔记(三)
  9. Javaの网络数据传输之Socket
  10. Python如何在函数外部调用函数内部的变量
  11. 帆软通过js删除数据库表中的数据
  12. 木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖
  13. 微信定位精灵服务器或网络异常,微信定位精灵系统界面无法更新怎么办
  14. Elastalert的报警功能拓展:分组报警
  15. 怎样获得元气骑士的损坏的机器人_元气骑士损坏的机器人怎么修复?机器人修复方法...
  16. 自动驾驶车辆控制(坐标转换与横向积分误差)
  17. AsyncLoadLocalImage ios 加载本地高清大图
  18. Mac使用技巧之如何禁用独立显卡
  19. 4个小例子告诉你:如何成为一名数据极客
  20. 【《自动控制原理(田玉平)》|课本知识点整理(一)】第 2 章 控制系统的输入 - 输出模型

热门文章

  1. OrCAD导出BOM表的方法
  2. 深度分析|2017阿里双十一1682亿背后的营销隐秘
  3. LCD显示屏和OLED显示屏的区别
  4. 动态规划解决TSP(旅行推销员问题)
  5. linux网卡ens160显示不出来,修改Centos7的网卡名称ens160、eno192改为eth0、eth1
  6. python操作网页flash视频_selenium自动化过程中如何操作Flash动画
  7. Jquery.ajax使用
  8. 电动自行车CE认证、电动滑板车CE认证审核新标准解析
  9. rippled 02 rippled api 协议使用
  10. 效果图色彩与色彩搭配原理