【Python】爬取理想论坛单帖爬虫

news/2024/7/19 11:31:39 标签: 爬虫, python

代码:

# 单帖爬虫,用于爬取理想论坛帖子得到发帖人,发帖时间和回帖时间,url例子见main函数
from bs4 import BeautifulSoup
import requests
import threading
import re

user_agent='Mozilla/4.0 (compatible;MEIE 5.5;windows NT)'
headers={'User-Agent':user_agent}

# 帖子爬虫类(多线程)
class topicCrawler(threading.Thread):
    def __init__(self,name,url):
        threading.Thread.__init__(self,name=name)
        self.name=name
        self.url=url
        self.infos=[]
    
    def run(self):
        while(self.url!="none"):
            print("线程"+self.name+"开始爬取页面"+self.url);

            try:
                rsp=requests.get(self.url,headers=headers)
                self.url="none"#用完之后置空,看下一页能否取到值
                soup= BeautifulSoup(rsp.text,'html.parser',from_encoding='utf-8')
                #print(rsp.text); # rsp.text是全文

                # 找出一页里每条发言
                for divs in soup.find_all('div',class_="postinfo"):
                    #print(divs.text) # divs.text包含作者和发帖时间的文字
                    
                    # 用正则表达式将多个空白字符替换成一个空格
                    RE = re.compile(r'(\s+)')
                    line=RE.sub(" ",divs.text)

                    arr=line.split(' ')
                    #print('楼层='+arr[1])
                    #print('作者='+arr[2].replace('只看:',''))
                    #print('日期='+arr[4])
                    #print('时间='+arr[5])
                    info={'楼层':arr[1],
                          '作者':arr[2].replace('只看:',''),
                          '日期':arr[4],
                          '时间':arr[5]}
                    self.infos.append(info);


                #找下一页所在地址
                for pagesDiv in soup.find_all('div',class_="pages"):
                    for strong in pagesDiv.find_all('strong'):
                        print('当前为第'+strong.text+'')

                        # 找右边的兄弟节点
                        nextNode=strong.next_sibling
                        if nextNode and nextNode.get("href"): # 右边的兄弟节点存在,且其有href属性
                            #print(nextNode.get("href"))
                            self.url='http://www.55188.com/'+nextNode.get("href")


                if self.url!="none":
                    print("有下一页,线程"+self.name+"前往下一页")
                    continue
                else:
                    print("无下一页,线程"+self.name+'爬取结束,开始打印...')
                    
                    for info in self.infos:
                        print('\n')
                        for key in info:
                            print(key+":"+info[key])

                    print("线程"+self.name+'打印结束.')


            except Exception as e:
                print("线程"+self.name+"发生异常。重新爬行")# 不管怎么出现的异常,就让它一直爬到底
                print(e);
                continue


# 入口函数
def main():
        #http://www.55188.com/thread-8205979-1-1.html
        #http://www.55188.com/thread-8324517-1-1.html
        #http://www.55188.com/thread-8205979-61-1.html
        url='http://www.55188.com/thread-8319519-1-1.html'
        tc=topicCrawler(name='crawler01',url=url)
        tc.start()

# 开始
main()

输出:

C:\Users\horn1\Desktop\python\14>python topicCrawler.py
线程crawler01开始爬取页面http://www.55188.com/thread-8319519-1-1.html
C:\Users\horn1\AppData\Local\Programs\Python\Python36\lib\site-packages\bs4\__init__.py:146: UserWarning: You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.
  warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.")
当前为第1页
当前为第1页
有下一页,线程crawler01前往下一页
线程crawler01开始爬取页面http://www.55188.com/thread-8319519-2-1.html
当前为第2页
当前为第2页
有下一页,线程crawler01前往下一页
线程crawler01开始爬取页面http://www.55188.com/thread-8319519-3-1.html
当前为第3页
当前为第3页
无下一页,线程crawler01爬取结束,开始打印...


楼层:楼主
作者:马泰的哥们
日期:2018-3-30
时间:09:59


楼层:2楼
作者:龙波2010
日期:2018-3-30
时间:10:00


楼层:3楼
作者:吗日个边
日期:2018-3-30
时间:10:07


楼层:4楼
作者:小兵旨
日期:2018-3-30
时间:10:30


楼层:5楼
作者:勇儿马甲
日期:2018-3-30
时间:10:37


楼层:6楼
作者:培训资料
日期:2018-3-30
时间:10:43


楼层:7楼
作者:短线冲
日期:2018-3-30
时间:10:56


楼层:8楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:9楼
作者:一赚
日期:2018-3-30
时间:11:01


楼层:10楼
作者:叼叼狼
日期:2018-3-30
时间:11:25


楼层:11楼
作者:酷我行
日期:2018-3-30
时间:11:40


楼层:12楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:13楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:14楼
作者:生活如愿
日期:2018-3-30
时间:11:55


楼层:15楼
作者:小兵旨
日期:2018-3-30
时间:12:42


楼层:16楼
作者:李汶安
日期:2018-3-30
时间:12:50


楼层:17楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:18楼
作者:小兵旨
日期:2018-3-30
时间:13:49


楼层:19楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:20楼
作者:酷我行
日期:2018-3-30
时间:17:21


楼层:21楼
作者:酷我行
日期:2018-3-30
时间:17:24


楼层:22楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:23楼
作者:酷我行
日期:2018-3-30
时间:21:37


楼层:24楼
作者:马泰的哥们
日期:发表于
时间:2018-3-30


楼层:25楼
作者:破局
日期:2018-3-30
时间:21:50


楼层:26楼
作者:小中大学生
日期:2018-3-31
时间:00:27


楼层:27楼
作者:理想5e9a18
日期:2018-3-31
时间:00:57


楼层:28楼
作者:龍樹
日期:2018-3-31
时间:06:29


楼层:29楼
作者:生活如愿
日期:2018-3-31
时间:07:49


楼层:30楼
作者:胶东判官
日期:2018-3-31
时间:12:32


楼层:31楼
作者:胶东判官
日期:2018-3-31
时间:12:32


楼层:32楼
作者:天上下鱼
日期:2018-3-31
时间:13:04


楼层:33楼
作者:天上下鱼
日期:2018-3-31
时间:13:05


楼层:34楼
作者:股市小小手
日期:2018-3-31
时间:14:48


楼层:35楼
作者:股市小小手
日期:2018-3-31
时间:14:50


楼层:36楼
作者:逍遥茶
日期:2018-3-31
时间:15:45


楼层:37楼
作者:马泰的哥们
日期:发表于
时间:2018-4-1


楼层:38楼
作者:理想5e9a18
日期:2018-4-1
时间:03:04


楼层:39楼
作者:马泰的哥们
日期:发表于
时间:2018-4-1


楼层:40楼
作者:陈龙333
日期:2018-4-1
时间:03:05


楼层:41楼
作者:马泰的哥们
日期:发表于
时间:2018-4-1


楼层:42楼
作者:理想5e9a18
日期:2018-4-1
时间:03:10


楼层:43楼
作者:马泰的哥们
日期:发表于
时间:2018-4-2


楼层:44楼
作者:理想5e9a18
日期:2018-4-2
时间:11:18


楼层:45楼
作者:马泰效应
日期:2018-4-4
时间:03:00


楼层:46楼
作者:马泰效应
日期:2018-4-4
时间:03:00


楼层:47楼
作者:韭菜008
日期:2018-4-4
时间:08:08
线程crawler01打印结束.

这个爬虫虽然简单,却是大计划中的一步。


http://www.niftyadmin.cn/n/1103367.html

相关文章

@FeignClient feign 如何选择 client类型

2019独角兽企业重金招聘Python工程师标准>>> FeignClient feign 如何选择 client类型 feign.SynchronousMethodHandler 的clinet类型 根据不同配置,自动装配不同的client类型 //没有Ribbon,hystrix 功能 FeignClient(name "ltest"…

简述适配器的概念、作用以及主机适配器的概念

1. 适配器的概念: 适配器是一个接口转换器,他可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。 2. 适配器的作用: (1)对数据进行缓存&#xff…

使用过的编辑器

己亥年 庚午月 癸巳日 宜入宅 忌婚嫁 今天想说一下我使用过的编辑器 dw(假装有图片) Dreamweaver 这个编辑器是在大一的时候使用的,当时只是使用它进行简单的静态页面编写.可以进行傻瓜式编程,对它印象最深的是可以代码和页面同时显示,进行调试.但是就目前我没有发现那个前端…

455:Periodic Strings

A character string is said to have period k if it can be formed by concatenating one or more repetitionsof another string of length k. For example, the string ”abcabcabcabc” has period 3, since it is formedby 4 repetitions of the string ”abc”. It also …

SCSI协议的定义、传输方式、通信过程

1. 直接连接存储(Direct Attached Storage,DAS)是一种存储设备与使用存储空间的服务器通过总线适配器和SCSI/FC线缆直接相连的技术。 2. SCSI(Small Computer System Interface,小型计算机系统接口)最初是一…

实验3:二层直连式WLAN组网设计

公众号:Python大数据分析与机器学习 小程序:零点潮流团 【实验目的】 1.理解二层直连式组网工作原理。 2.掌握二层直连式WLAN组网配置方法。 【实验环境】 1.安装Win10/Win7/XP操作系统的PC计算机。 2.ENSP软件 【实验内容…

CQRS之旅——旅程6(我们系统的版本管理)

旅程6:我们系统的版本管理 准备下一站:升级和迁移“变化是生活的调味品。”威廉考珀 此阶段的最高目标是了解如何升级包含实现CQRS模式和事件源的限界上下文的系统。团队在这一阶段实现的用户场景包括对代码的更改和对数据的更改:更改了一些现有的数据模…

cmd窗口操作mysql数据库

本文涉及到的操作均是基于Windows 10系统,在cmd窗口命令行模式下,操作mysql。 (1)进入mysql安装的目录下的bin文件夹,执行mysql -uroot -proot; (2)show databases:查看当前的mysq…