Discuz 论坛模块全部帖子和评论爬取

Discuz 是一款由PHP编写的开源论坛

Discuz 官方论坛: https://www.discuz.net/forum.php

要爬取的页面地址:

Discuz BUG与问题交流板块;https://www.discuz.net/forum-70-1.html

创建工程

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\discuzYou can start your first spider with:cd discuzscrapy genspider example example.comC:\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写入itemself.save_json.export_item(item)return item

开始爬取 (单页面)

spider/discuz_spider.py

  1. 首先要获取当前页面的所有帖子的url 通知爬取帖子的函数去处理

    # 此页面中所有帖子的列表tbody = response.xpath("//table[@id='threadlisttableid']/tbody")
    

  2. 遍历每一项取出其中的信息 其中每一个元素标签上都有一个唯一的id 作为帖子的id 但第一项没有

    for tb in tbody:# 取出这个元素的id 字符串p_id_str = tb.xpath("./@id").get()# 通过正则表达式取出数字id 这就是这个帖子的idp_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# 获取下一个页面的urlnext_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)
    

ref").get()


![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0GwTBzxo-1595771372682)(C:\Users\PeiJingbo\AppData\Roaming\Typora\typora-user-images\image-20200726115622968.png)\]](https://img-blog.csdnimg.cn/20200726215158616.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI1OTExMTcz,size_16,color_FFFFFF,t_70)# 如果没有下一个按钮则退出程序
# 这个列表有两千多项,,,加了个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)

[外链图片转存中…(img-0GwTBzxo-1595771372682)]

查看结果 存在于data.json文件中

Discuz 论坛模块全部帖子和评论爬取相关推荐

  1. python爬取网易云音乐_Python 从零开始爬虫(七)——实战:网易云音乐评论爬取(附加密算法)...

    前言 某宝评论区已经成功爬取了,jd的也是差不多的方法,说实话也没什么好玩的,我是看上它们分析简单,又没加密才拿来试手的.如果真的要看些有趣的评论的话,我会选择网易云音乐,里面汇聚了哲学家,小说家,s ...

  2. 大数据信息资料采集:文化公众号槽边往事历史文章搜集评论爬取

    大数据信息资料采集:文化公众号槽边往事历史文章搜集评论爬取 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所有 ...

  3. python处理json数据——网易云评论爬取

    python处理json数据--网易云评论爬取 准备 代码 准备 1.python 3.7 2.需要安装的库: requests jsonpath pandas time fake_useragent ...

  4. php 爬取一个人的网易云评论,网易云音乐评论爬取

    # coding=gbk import requests import json c='网易云爬虫实战一' print(c) music_url = 'https://music.163.com/#/ ...

  5. scrapy框架下的豆瓣电影评论爬取以及登录,以及生成词云和柱状图

    由于豆瓣在今年5月份已经禁止展示所有短评,只展示最热的500条数据,并且在爬取到240条的时候,如果没有登录的话,会提示登录. 因此几天的爬虫,包括豆瓣的自动登录和数据爬取后批量存入pymysql数据 ...

  6. 大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则

    大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所 ...

  7. No.2 大众点评评论爬取

    大众点评评论爬取 一.简介 网址:http://www.dianping.com/shop/G41gaJfqGBICtiVY 效果:爬取评论 使用框架:selenium.requests.re 难度系 ...

  8. 【爬虫实战】评论爬取及词频统计详解

    爬虫 前言 aqy评论爬取 请求数据 数据清洗 爬取数据 分词 停用词 绘制统计表 词云绘制 主函数 一些其他问题优化 前言 本项目来自Baidu AI Studio相关python课程. aqy评论 ...

  9. 大数据信息资料采集:情感公号风茕子历史文章评论爬取八爪鱼采集

    大数据信息资料采集:情感公号风茕子历史文章评论爬取八爪鱼采集 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所 ...

最新文章

  1. 字符串转为小数点,乘以一个数以后,转换为科学计数法,再把科学计数法转化为字符串
  2. mysql用if判断关联的表_mysql表连接,子查询以及if判断
  3. 【git】【eclipse】免密/SSH 方式连接免登录
  4. servlet接收传过来的数据流
  5. THINKPHP增删改查--(改)
  6. cad和python哪个好学_对纯外行人来说,学习PS和Python哪个更容易?
  7. 使用OpenSSL工具制作X.509证书的方法及其注意事项总结
  8. 不能将参数转化为lparam_如何将管理需求转化为信息化方案
  9. mysql密码正确却提示错误,不使用密码反而能登录
  10. java delete file 失败_文件无法删除java.io.IOException: Unable to delete
  11. linux任务计划、chkconfig工具、systemd、unit和target介绍
  12. 统计学基础知识(一)
  13. 短视频剪辑技巧及运营方法 ,让你的视频更自然
  14. 计算机打印不了测试纸,win10系统打印机无法打印测试页的解决办法
  15. 真正的免费云时代来临,免费1T全能空间提供1T免费全能空间申请,
  16. Linux中etc目录是什么缩写
  17. 0x0000050蓝屏srvsys_win7电脑出现蓝屏0x00000050提示srv.sys如何解决
  18. 码绘VS手绘(二)动态绘图
  19. agv机器人无人仓系统-开源agv控制系统opentcs
  20. 用js写卡牌游戏(五)

热门文章

  1. 知乎500万人热议:如何快速培养英语思维方式?
  2. 红队笔记-1(主机发现,情报收集,内网信息收集)
  3. 大学物理第十三章复习笔记:波动光学基础
  4. matlab 降低计算精度,MATLAB 计算精度控制
  5. php对接阿里巴巴开放平台
  6. JavaScript设置右下角悬浮窗
  7. linux文件加密代码,OpenSSL 加密文件的完整实现代码
  8. CXM百科 | 那些年我们做过的问卷题——评分量表题
  9. 处理RAW格式的图像,需要什么软件?
  10. 为什么你的工作总是没能做好呢?