python discuz论坛帖子_[Scrapy爬虫实战]Discuz论坛版块内全部帖子获取
先插入封面(老惯例了)
高清无码PDF见:
链接:https://pan.baidu.com/s/1qD0IBElUFTFv0F34QV6vIA
提取码:0e6n
项目源码见:
链接:https://pan.baidu.com/s/1OF5EUFTCuv4n_6GJ_MCv-g
提取码:p666
如果你想了解更过关于Python爬虫的相关知识建议(不要来问我,我也是新手)
欢迎加入群聊【来自裴同学的问候(1006320973)】:点击此链接或搜索QQ群号码https://jq.qq.com/?_wv=1027&k=RZs0P4LO
正文开始:
Discuz 论坛模块全部帖子和评论爬取
Discuz 是一款由PHP编写的开源论坛
Discuz 官方论坛:https://www.discuz.net/forum.php
要爬取的页面地址:
Discuz BUG与问题交流板块;https://www.discuz.net/forum-70-1.html
创建工程
ps: 和其他字不一样颜色的是我执行的命令scrapy startproject discuz
C:\Users\PeiJingbo\Desktop\discuz>scrapy startproject discuz
New Scrapy project 'discuz', using template directory 'c:\program files\python37\lib\site-packages\scrapy\templates\project', created in:
C:\Users\PeiJingbo\Desktop\discuz\discuz
You can start your first spider with:
cd discuz
scrapy genspider example example.com
C:\Users\PeiJingbo\Desktop\discuz>
进入生成的目录cd discuz
创建爬虫
找个文件夹 执行scrapy genspider discuz_spider discuz,net
C:\Users\PeiJingbo\Desktop\discuz\discuz>scrapy genspider discuz_spider discuz,net
Created spider 'discuz_spider' using template 'basic' in module:
discuz.spiders.discuz_spider
打开工程
应该打开创建项目命令生成的那个目录 如果选择再下层目录 就不能导模块了
修改配置settings,py
ROBOTSTXT_OBEY = False# 不遵循ROBOTS协议
DEFAULT_REQUEST_HEADERS = {# 设置默认请求头
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'user-agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
}
ITEM_PIPELINES = {# 启用 PIPELINES
'discuz.pipelines.DiscuzPipeline': 300,
}
DOWNLOAD_DELAY = 0.1# 下载延时
存储item.py
# 每一条帖子的信息
class Post(scrapy.Item):
pid = scrapy.Field()
author = scrapy.Field()
title = scrapy.Field()
time = scrapy.Field()
url = scrapy.Field()
post_list = scrapy.Field()
# 每一条帖子评论的信息
class PostItem(scrapy.Item):
iid = scrapy.Field()
author = scrapy.Field()
time = scrapy.Field()
content = scrapy.Field()
pipelines.py
class DiscuzPipeline:
# 计数变量
number = 0
# 爬虫初始化
def __init__(self):
# 打开文件
self.fp = open("data.json", 'wb')
# 存储json的格式
self.save_json = JsonItemExporter(self.fp, encoding="utf-8", ensure_ascii=False, indent=4)
# 开始存储
self.save_json.start_exporting()
def close_spider(self, spider):
# 关闭爬虫时 写入所有数据
self.save_json.finish_exporting()
# 关闭文件
self.fp.close()
print("共爬取 %d 项数据" % self.number)
def process_item(self, item, spider):
# 爬取到每一项
print(self.number)
self.number += 1
# 转为json写入item
self.save_json.export_item(item)
return item
开始爬取 (单页面)spider/discuz_spider.py
1 先要获取当前页面的所有帖子的url 通知爬取帖子的函数去处理
# 此页面中所有帖子的列表
tbody = response.xpath("//table[@id='threadlisttableid']/tbody")
2. 遍历每一项取出其中的信息 其中每一个元素标签上都有一个唯一的id 作为帖子的id 但第一项2没有
for tb in tbody:# 取出这个元素的id 字符串
p_id_str = tb.xpath("./@id").get()
# 通过正则表达式取出数字id 这就是这个帖子的id
p_id_match = re.match(r"normalthread_(\d+)", p_id_str)
# 开头有一项是不带id的空项 为了跳过做判断
if not p_id_match:
continue# 取出数字id
p_id = p_id_match.group(1)# 获取作者
author = tb.xpath("./tr/td[2]//a/text()").get()
# 获取页面url
url = response.urljoin(tb.xpath("./tr/th/a[@class='s xst']/@href").get())
其中时间有两种状态 第一种是 写着几天前 或者是几小时前这种 在文字标签有title属性就是具体日期
第二张就是直接是直接为时间 判断如果第一种取出为空则取第二种# 获取时间 有两种状态
time = tb.xpath(".//tr/td[2]/em/span/span/@title").get()
if not time:
time = tb.xpath(".//tr/td[2]/em/span/text()").get()
通知下一个函数去爬取具体内容 并将帖子的基本信息传递过去# 通知下面函数进行爬取
yield scrapy.Request(url, meta={"id": p_id, "url": url, "author": author, "time": time},callback=self.getPost)
3. 爬取帖子具体内容# 取出已经准备好的信息
p_id = response.meta["id"]
p_author = response.meta["author"]
p_time = response.meta["time"]
p_url = response.meta["url"]
# 获取帖子标题
p_title = response.xpath("//*[@id='thread_subject']/text()").get()
其中所有的内容都是以列表的形式展现的 结构一致# 获取评论列表
content_list = response.xpath(".//*[@id='postlist']/div")
遍历帖子列表
# 准备存放所有评论的列表
p_content_list = []for c in content_list:
# 评论编号
cid_match = re.match(r"post_(\d+)", c.xpath("./@id").get())
if not cid_match:
continue
# 取出数字编号
cid = cid_match.group(1) # 评论作者
author = c.xpath(".//div[@id='favatar" + cid + "']//a[@class='xw1']/text()").get()
时间信息同样有两种状态 第二种带有 "发表于 " 字样
# 评论时间 同样有两种状态
c_time = c.xpath(".//*[@id='authorposton" + cid + "']/span/@title").get()
if not c_time:
c_time = str(c.xpath(".//*[@id='authorposton" + cid + "']/text()").get()).strip().replace("发表于 ", '')# 评论内容
content = c.xpath("string(.//div[@class='t_fsz'])").get()
存储
# 构造一个评论元素
post_item = PostItem(iid=cid, author=author, time=c_time, content=content)
# 添加到列表
p_content_list.append(post_item)
列表遍历完成
# 传递到pipelines
new_post = Post(pid=p_id, author=p_author, title=p_title, time=p_time, post_list=p_content_list, url=p_url)
# 传递给pipelines
yield new_post
多页面爬取
获取下一页的url 定义一个类的变量来记录页数# 每爬取一页加一
self.page += 1
# 获取下一个页面的url
next_url = response.xpath(".//div[@id='pgt']/span[@id='fd_page_top']/div[@class='pg']/a[@class='nxt']/@href").get()
# 如果没有下一个按钮则退出程序
# 这个列表有两千多项,,,加了个200的结束条件
if not next_url or self.page >= 500:
return
# 将下一页url与主机名和协议进行组合
next_url = response.urljoin(next_url)
# 通知自己去请求下一页
yield scrapy.Request(url=next_url, callback=self.parse)
结果
存在于data.json中
python discuz论坛帖子_[Scrapy爬虫实战]Discuz论坛版块内全部帖子获取相关推荐
- python爬去新浪微博_荐爬虫实战 新浪微博爬取 详细分析
目标 #2020.5.22 #author:pmy #目标:爬取最爱的绵羊的微博,包含时间,文本内容,点赞数,评论数与转发数 #在更换博主时主要在于修改headers中的referer和参数中的con ...
- Python之Scrapy爬虫实战--爬取妹子图
1.前言 反正闲着也是闲着,不如来学习啊! 2.关键代码 新建项目 不会的同学可参考我的另一篇博文,这里不再赘述:Python之Scrapy爬虫实战–新建scrapy项目 这里只讲一下几个关键点,完整 ...
- python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...
小猪的Python学习之旅 -- 4.Scrapy爬虫框架初体验 Python 引言: 经过前面两节的学习,我们学会了使用urllib去模拟请求,使用 Beautiful Soup和正则表达式来处理网 ...
- 微博scrapy爬虫实战经验分享
微博scrapy爬虫实战经验分享 这两天想要爬一些微博的数据,在github上找到了开源代码,但是在实际使用过程中遇到了很多困难,在此做一下记录. 安装MongoDB 首先安装MongoDB,Wind ...
- 图虫网、人人字幕Scrapy爬虫实战分享 附源码
图虫网.人人字幕Scrapy爬虫实战分享 文章已发表在个人博客,欢迎点击这里访问 序 最近用Scrapy爬取了图虫和人人字幕,图虫网以前是纯摄影爱好论坛,现在往图库方向发展了,图片质量上佳,人人字幕也 ...
- Scrapy 爬虫实战-爬取字幕库
Scrapy 爬虫实战-爬取字幕库 1.首先,创建Scrapy框架 创建工程 scrapy startproject zimuku创建爬虫程序 cd zimuku scrapy genspider z ...
- python学习(三)scrapy爬虫框架(二)——创建一个scrapy爬虫
在创建新的scrapy爬虫之前,我们需要先了解一下创建一个scrapy爬虫的基本步骤 第一步:确定要爬取的数据 以爬取豆瓣电影数据为例: 每部电影所要爬取的信息有: 片名:<头号玩家> 导 ...
- python爬虫天气实例scrapy_2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报...
1.项目准备:网站地址:http://quanzhou.tianqi.com/ 2.创建编辑Scrapy爬虫: scrapy startproject weather scrapy genspider ...
- python爬取论坛付费内容_Python爬虫抓取论坛关键字过程解析
前言: 之前学习了用python爬虫的基本知识,现在计划用爬虫去做一些实际的数据统计功能.由于前段时间演员的诞生带火了几个年轻的实力派演员,想用爬虫程序搜索某论坛中对于某些演员的讨论热度,并按照日期统 ...
最新文章
- vue中显示和隐藏如何做动画_vue-State Transitions(状态转换)
- SQL Server 2012 OFFSET/FETCH NEXT分页示例
- 【Silverlight】Bing Maps开发应用与技巧三:Bing Maps Silverlight Control的离线开发
- linux 入侵检测
- idea创建maven的web项目
- 学习笔记之06-点语法
- 【计算机网络】数据链路层 : 局域网基本概念 ( 局域网分类 | 拓扑结构 | 局域网特点 | 局域网传输介质 | 介质访问控制方法 | IEEE 802 | 链路层 LLC、MAC 控制子层 )
- reactor线程模型_简单了解Java Netty Reactor三种线程模型
- 保持windows2003域控制器的安全
- 云端之战:Oracle研发总裁Thomas Kurian 加盟 Google Cloud
- 海报素材模板|超好看的新年素材,你真的不来看一看吗?
- 一元多项式的乘法与加法运算_如果加法变成【乘法】 , 那么什么能变成【加法】 ? ——记一则函数方程...
- ADNI-MRI-PET-ANALYSIS
- MIC - 最大信息系数
- 关于微信聊天界面更换背景
- flutter安装包百度网盘
- R语言ggcharts包的dumbbell_chart函数可视化哑铃图(对比两个年份数据的差异)、scale_y_continuous函数中的labels参数自定义设置X轴坐标标签的格式
- nginx的全局配置和HTTP相关配置
- Unity/Animator -- 创建Animator Controller
- 输入法半角和全角的快捷转换_电脑操作快捷键
热门文章
- XenApp应用虚拟化介绍
- raid卷构建实操(raid0、raid1、raid5、raid6以及raid10),可跟做
- 美团 键盘大小写转换 最小敲击次数
- 【高等数学基础进阶】多元函数微分学-重极限、连续、偏导数、全微分
- 梅森数形如2 ​n ​​ −1的素数称为梅森数(Mersenne Number)。例如2 ​2 ​​ −1=3、2 ​3 ​​ −1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2 ​3
- java虚数复数计算_真实的虚数,不仅不是没用,而且还很实在
- Elasticsearch 集群内应该设置多少个分片(shard)?
- Awesome Free ChatGPT(免费的chatgpt镜像网站)
- Bison 的构成与使用
- CST(CST Studio Suite)建立工程和基本绘图方法