先插入封面(老惯例了)

高清无码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论坛版块内全部帖子获取相关推荐

  1. python爬去新浪微博_荐爬虫实战 新浪微博爬取 详细分析

    目标 #2020.5.22 #author:pmy #目标:爬取最爱的绵羊的微博,包含时间,文本内容,点赞数,评论数与转发数 #在更换博主时主要在于修改headers中的referer和参数中的con ...

  2. Python之Scrapy爬虫实战--爬取妹子图

    1.前言 反正闲着也是闲着,不如来学习啊! 2.关键代码 新建项目 不会的同学可参考我的另一篇博文,这里不再赘述:Python之Scrapy爬虫实战–新建scrapy项目 这里只讲一下几个关键点,完整 ...

  3. python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...

    小猪的Python学习之旅 -- 4.Scrapy爬虫框架初体验 Python 引言: 经过前面两节的学习,我们学会了使用urllib去模拟请求,使用 Beautiful Soup和正则表达式来处理网 ...

  4. 微博scrapy爬虫实战经验分享

    微博scrapy爬虫实战经验分享 这两天想要爬一些微博的数据,在github上找到了开源代码,但是在实际使用过程中遇到了很多困难,在此做一下记录. 安装MongoDB 首先安装MongoDB,Wind ...

  5. 图虫网、人人字幕Scrapy爬虫实战分享 附源码

    图虫网.人人字幕Scrapy爬虫实战分享 文章已发表在个人博客,欢迎点击这里访问 序 最近用Scrapy爬取了图虫和人人字幕,图虫网以前是纯摄影爱好论坛,现在往图库方向发展了,图片质量上佳,人人字幕也 ...

  6. Scrapy 爬虫实战-爬取字幕库

    Scrapy 爬虫实战-爬取字幕库 1.首先,创建Scrapy框架 创建工程 scrapy startproject zimuku创建爬虫程序 cd zimuku scrapy genspider z ...

  7. python学习(三)scrapy爬虫框架(二)——创建一个scrapy爬虫

    在创建新的scrapy爬虫之前,我们需要先了解一下创建一个scrapy爬虫的基本步骤 第一步:确定要爬取的数据 以爬取豆瓣电影数据为例: 每部电影所要爬取的信息有: 片名:<头号玩家> 导 ...

  8. python爬虫天气实例scrapy_2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报...

    1.项目准备:网站地址:http://quanzhou.tianqi.com/ 2.创建编辑Scrapy爬虫: scrapy startproject weather scrapy genspider ...

  9. python爬取论坛付费内容_Python爬虫抓取论坛关键字过程解析

    前言: 之前学习了用python爬虫的基本知识,现在计划用爬虫去做一些实际的数据统计功能.由于前段时间演员的诞生带火了几个年轻的实力派演员,想用爬虫程序搜索某论坛中对于某些演员的讨论热度,并按照日期统 ...

最新文章

  1. vue中显示和隐藏如何做动画_vue-State Transitions(状态转换)
  2. SQL Server 2012 OFFSET/FETCH NEXT分页示例
  3. 【Silverlight】Bing Maps开发应用与技巧三:Bing Maps Silverlight Control的离线开发
  4. linux 入侵检测
  5. idea创建maven的web项目
  6. 学习笔记之06-点语法
  7. 【计算机网络】数据链路层 : 局域网基本概念 ( 局域网分类 | 拓扑结构 | 局域网特点 | 局域网传输介质 | 介质访问控制方法 | IEEE 802 | 链路层 LLC、MAC 控制子层 )
  8. reactor线程模型_简单了解Java Netty Reactor三种线程模型
  9. 保持windows2003域控制器的安全
  10. 云端之战:Oracle研发总裁Thomas Kurian 加盟 Google Cloud
  11. 海报素材模板|超好看的新年素材,你真的不来看一看吗?
  12. 一元多项式的乘法与加法运算_如果加法变成【乘法】 , 那么什么能变成【加法】 ? ——记一则函数方程...
  13. ADNI-MRI-PET-ANALYSIS
  14. MIC - 最大信息系数
  15. 关于微信聊天界面更换背景
  16. flutter安装包百度网盘
  17. R语言ggcharts包的dumbbell_chart函数可视化哑铃图(对比两个年份数据的差异)、scale_y_continuous函数中的labels参数自定义设置X轴坐标标签的格式
  18. nginx的全局配置和HTTP相关配置
  19. Unity/Animator -- 创建Animator Controller
  20. 输入法半角和全角的快捷转换_电脑操作快捷键

热门文章

  1. XenApp应用虚拟化介绍
  2. raid卷构建实操(raid0、raid1、raid5、raid6以及raid10),可跟做
  3. 美团 键盘大小写转换 最小敲击次数
  4. 【高等数学基础进阶】多元函数微分学-重极限、连续、偏导数、全微分
  5. 梅森数形如2 ​n ​​ −1的素数称为梅森数(Mersenne Number)。例如2 ​2 ​​ −1=3、2 ​3 ​​ −1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2 ​3
  6. java虚数复数计算_真实的虚数,不仅不是没用,而且还很实在
  7. Elasticsearch 集群内应该设置多少个分片(shard)?
  8. Awesome Free ChatGPT(免费的chatgpt镜像网站)
  9. Bison 的构成与使用
  10. CST(CST Studio Suite)建立工程和基本绘图方法