• 【pyhon】理想论坛单帖爬虫取得信息存入MySql数据库


    代码:

    # 单帖爬虫,用于爬取理想论坛单个帖子得到发帖人,发帖时间和回帖时间并存入数据库,url例子见main函数
    from bs4 import BeautifulSoup
    import requests
    import threading
    import re
    import pymysql
    
    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(len(arr)) 
                        arrLength=len(arr)
    
                        if arrLength==7:
                            info={'楼层':arr[1],
                                  '作者':arr[2].replace('只看:',''),
                                  '日期':arr[4],
                                  '时间':arr[5]}
                            self.infos.append(info);
                        elif arrLength==8:
                            info={'楼层':arr[1],
                                  '作者':arr[2].replace('只看:',''),
                                  '日期':arr[5],
                                  '时间':arr[6]}
                            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('
    ')
                            for key in info:
                                print(key+":"+info[key])
    
                        print("线程"+self.name+'打印结束.')
    
                        insertDB(self.infos)
    
    
                except Exception as e:
                    print("线程"+self.name+"发生异常。重新爬行")# 不管怎么出现的异常,就让它一直爬到底
                    print(e);
                    continue
    
    # 数据库插值
    def insertDB(infos):
        conn=pymysql.connect(host='127.0.0.1',user='root',passwd='12345678',db='test',charset='utf8')
        
    
        for info in infos:
            sql="insert into test.topic(floor,author,tdate,ttime) values ('"+info['楼层']+"','"+info['作者']+"','"+info['日期']+"','"+info['时间']+"'"+")"
            print(sql)
            conn.query(sql)
        
        conn.commit()# 写操作之后commit不可少
        conn.close()
    
    
    # 入口函数
    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:Usershorn1Desktoppython15>python topicCrawler.py
    线程crawler01开始爬取页面http://www.55188.com/thread-8319519-1-1.html
    C:Usershorn1AppDataLocalProgramsPythonPython36libsite-packagess4__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
    时间:10:59
    
    
    楼层:9楼
    作者:一赚
    日期:2018-3-30
    时间:11:01
    
    
    楼层:10楼
    作者:叼叼狼
    日期:2018-3-30
    时间:11:25
    
    
    楼层:11楼
    作者:酷我行
    日期:2018-3-30
    时间:11:40
    
    
    楼层:12楼
    作者:马泰的哥们
    日期:2018-3-30
    时间:11:48
    
    
    楼层:13楼
    作者:马泰的哥们
    日期:2018-3-30
    时间:11:49
    
    
    楼层:14楼
    作者:生活如愿
    日期:2018-3-30
    时间:11:55
    
    
    楼层:15楼
    作者:小兵旨
    日期:2018-3-30
    时间:12:42
    
    
    楼层:16楼
    作者:李汶安
    日期:2018-3-30
    时间:12:50
    
    
    楼层:17楼
    作者:马泰的哥们
    日期:2018-3-30
    时间:13:46
    
    
    楼层:18楼
    作者:小兵旨
    日期:2018-3-30
    时间:13:49
    
    
    楼层:19楼
    作者:马泰的哥们
    日期:2018-3-30
    时间:14:02
    
    
    楼层:20楼
    作者:酷我行
    日期:2018-3-30
    时间:17:21
    
    
    楼层:21楼
    作者:酷我行
    日期:2018-3-30
    时间:17:24
    
    
    楼层:22楼
    作者:马泰的哥们
    日期:2018-3-30
    时间:17:30
    
    
    楼层:23楼
    作者:酷我行
    日期:2018-3-30
    时间:21:37
    
    
    楼层:24楼
    作者:马泰的哥们
    日期:2018-3-30
    时间:21:44
    
    
    楼层: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
    时间:03:01
    
    
    楼层:38楼
    作者:理想5e9a18
    日期:2018-4-1
    时间:03:04
    
    
    楼层:39楼
    作者:马泰的哥们
    日期:2018-4-1
    时间:03:05
    
    
    楼层:40楼
    作者:陈龙333
    日期:2018-4-1
    时间:03:05
    
    
    楼层:41楼
    作者:马泰的哥们
    日期:2018-4-1
    时间:03:08
    
    
    楼层:42楼
    作者:理想5e9a18
    日期:2018-4-1
    时间:03:10
    
    
    楼层:43楼
    作者:马泰的哥们
    日期:2018-4-2
    时间:09:30
    
    
    楼层: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打印结束.
    insert into test.topic(floor,author,tdate,ttime) values ('楼主','马泰的哥们','2018-3-30','09:59')
    insert into test.topic(floor,author,tdate,ttime) values ('2楼','龙波2010','2018-3-30','10:00')
    insert into test.topic(floor,author,tdate,ttime) values ('3楼','吗日个边','2018-3-30','10:07')
    insert into test.topic(floor,author,tdate,ttime) values ('4楼','小兵旨','2018-3-30','10:30')
    insert into test.topic(floor,author,tdate,ttime) values ('5楼','勇儿马甲','2018-3-30','10:37')
    insert into test.topic(floor,author,tdate,ttime) values ('6楼','培训资料','2018-3-30','10:43')
    insert into test.topic(floor,author,tdate,ttime) values ('7楼','短线冲','2018-3-30','10:56')
    insert into test.topic(floor,author,tdate,ttime) values ('8楼','马泰的哥们','2018-3-30','10:59')
    insert into test.topic(floor,author,tdate,ttime) values ('9楼','一赚','2018-3-30','11:01')
    insert into test.topic(floor,author,tdate,ttime) values ('10楼','叼叼狼','2018-3-30','11:25')
    insert into test.topic(floor,author,tdate,ttime) values ('11楼','酷我行','2018-3-30','11:40')
    insert into test.topic(floor,author,tdate,ttime) values ('12楼','马泰的哥们','2018-3-30','11:48')
    insert into test.topic(floor,author,tdate,ttime) values ('13楼','马泰的哥们','2018-3-30','11:49')
    insert into test.topic(floor,author,tdate,ttime) values ('14楼','生活如愿','2018-3-30','11:55')
    insert into test.topic(floor,author,tdate,ttime) values ('15楼','小兵旨','2018-3-30','12:42')
    insert into test.topic(floor,author,tdate,ttime) values ('16楼','李汶安','2018-3-30','12:50')
    insert into test.topic(floor,author,tdate,ttime) values ('17楼','马泰的哥们','2018-3-30','13:46')
    insert into test.topic(floor,author,tdate,ttime) values ('18楼','小兵旨','2018-3-30','13:49')
    insert into test.topic(floor,author,tdate,ttime) values ('19楼','马泰的哥们','2018-3-30','14:02')
    insert into test.topic(floor,author,tdate,ttime) values ('20楼','酷我行','2018-3-30','17:21')
    insert into test.topic(floor,author,tdate,ttime) values ('21楼','酷我行','2018-3-30','17:24')
    insert into test.topic(floor,author,tdate,ttime) values ('22楼','马泰的哥们','2018-3-30','17:30')
    insert into test.topic(floor,author,tdate,ttime) values ('23楼','酷我行','2018-3-30','21:37')
    insert into test.topic(floor,author,tdate,ttime) values ('24楼','马泰的哥们','2018-3-30','21:44')
    insert into test.topic(floor,author,tdate,ttime) values ('25楼','破局','2018-3-30','21:50')
    insert into test.topic(floor,author,tdate,ttime) values ('26楼','小中大学生','2018-3-31','00:27')
    insert into test.topic(floor,author,tdate,ttime) values ('27楼','理想5e9a18','2018-3-31','00:57')
    insert into test.topic(floor,author,tdate,ttime) values ('28楼','龍樹','2018-3-31','06:29')
    insert into test.topic(floor,author,tdate,ttime) values ('29楼','生活如愿','2018-3-31','07:49')
    insert into test.topic(floor,author,tdate,ttime) values ('30楼','胶东判官','2018-3-31','12:32')
    insert into test.topic(floor,author,tdate,ttime) values ('31楼','胶东判官','2018-3-31','12:32')
    insert into test.topic(floor,author,tdate,ttime) values ('32楼','天上下鱼','2018-3-31','13:04')
    insert into test.topic(floor,author,tdate,ttime) values ('33楼','天上下鱼','2018-3-31','13:05')
    insert into test.topic(floor,author,tdate,ttime) values ('34楼','股市小小手','2018-3-31','14:48')
    insert into test.topic(floor,author,tdate,ttime) values ('35楼','股市小小手','2018-3-31','14:50')
    insert into test.topic(floor,author,tdate,ttime) values ('36楼','逍遥茶','2018-3-31','15:45')
    insert into test.topic(floor,author,tdate,ttime) values ('37楼','马泰的哥们','2018-4-1','03:01')
    insert into test.topic(floor,author,tdate,ttime) values ('38楼','理想5e9a18','2018-4-1','03:04')
    insert into test.topic(floor,author,tdate,ttime) values ('39楼','马泰的哥们','2018-4-1','03:05')
    insert into test.topic(floor,author,tdate,ttime) values ('40楼','陈龙333','2018-4-1','03:05')
    insert into test.topic(floor,author,tdate,ttime) values ('41楼','马泰的哥们','2018-4-1','03:08')
    insert into test.topic(floor,author,tdate,ttime) values ('42楼','理想5e9a18','2018-4-1','03:10')
    insert into test.topic(floor,author,tdate,ttime) values ('43楼','马泰的哥们','2018-4-2','09:30')
    insert into test.topic(floor,author,tdate,ttime) values ('44楼','理想5e9a18','2018-4-2','11:18')
    insert into test.topic(floor,author,tdate,ttime) values ('45楼','马泰效应','2018-4-4','03:00')
    insert into test.topic(floor,author,tdate,ttime) values ('46楼','马泰效应','2018-4-4','03:00')
    insert into test.topic(floor,author,tdate,ttime) values ('47楼','韭菜008','2018-4-4','08:08')

    数据库中数据:

     

  • 相关阅读:
    java中接口与抽象类的区别
    单例模式的懒汉式和饿汉式实现分析
    filter的原理(转)
    事务与连接池
    request对象和response对象的作用和相关方法
    java环境变量配置
    关于http
    java笔记5
    理解String的intern()方法
    用递归的方法算出给定字符串的最大连续重复字符的重复次数
  • 原文地址:https://www.cnblogs.com/heyang78/p/8716125.html
Copyright © 2020-2023  润新知