python爬取缠中说禅凯迪论坛历史所有文章及回复(二)

2019-01-09  本文已影响12人  喵鸢

缠师最早的天涯论坛爬取:https://www.jianshu.com/p/81a5da4fa161
python爬取缠中说禅天涯论坛历史所有文章及回复(一)

前期准备

找接口和规律

翻页接口

单个文章接口

单个文章url获取

同一文章中的评论翻页

文章内评论翻页url获取

解决思路

代码

#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyquery import PyQuery as pq
import codecs
import os
import requests
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36'}

def makedir(dirName):
    tempPath=dirName
    targetPath='G://'+tempPath
    #print(targetPath)
    if not os.path.exists(targetPath):
        os.makedirs(targetPath)
    else:
        print('路径已经存在!')
    return targetPath

def get_atrList(file_path):
    base_url = 'http://user.kdnet.net/posts.asp?userid=648377&t=0&page='
    # base_url = 'http://user.kdnet.net/posts.asp?userid=295294&t=0&page=' #
    for i in range(1,2):
        url = base_url + str(i)
        print url
        home_page_file = requests.get(url, headers=headers)
        home_page_file.encoding = 'GBK'
        home_page_file = home_page_file.text
        doc = pq(home_page_file)
        for item in doc('#ViewMode > div.tabs-cont > div > div').items('div[class="act-cont clearfix"]'):
            item_url = 'http:'+ item(' div > a').attr.href
            item_name = item('div > a').text().replace('*','').replace('/','').replace(':','')
            item_time = item('span.time').html().split('</font>')[1].strip().replace(':','-')
            print item_name,item_url,item_time
            download_post(item_url,item_name,file_path,item_time)



# 主下载函数
def download_post(atr_url,atr_name,file_path,atr_time):
    ########## 数据抓取 ##########
    home_page_file = requests.get(atr_url, headers=headers)
    home_page_file.encoding = 'GBK'
    home_page_file = home_page_file.text
    doc = pq(home_page_file)
    #print doc
    ########## 获取帖子总体信息,例如标题、作者、时间等 ##########
    # 帖子标题
    post_title = doc('div.posts-title').text()
    # 帖子作者
    post_author = doc('#userinfo_1 > span > a').text()
    # 帖子时间
    post_time_year = doc('div.posts-posted').text().split()[2].replace('/','-')
    post_time_date = doc('div.posts-posted').text().split()[3]
    post_time = (post_time_year+u' '+post_time_date).replace(':','-')
    #print post_title,post_author,post_time,type(post_time)
    # 打开文件
    filename = file_path + '//' + atr_time + atr_name + '.txt'
    print filename
    #print filename,type(filename)
    f = codecs.open(filename, 'w', 'utf-8')
    f.write(u'帖子标题:' + post_title + '\r\n')
    f.write(u'帖子作者:' + post_author + '\r\n')
    f.write(u'帖子时间:' + post_time + '\r\n')
    f.write(u'帖子地址:' + atr_url + '\r\n')
    f.write(u'#################### 我是分隔线 ####################\r\n\r\n')

    ########## 获取帖子第一页的内容 ##########
    post_content = doc('div.posts-cont').text().split()
    for content in post_content:
        f.write(u'  ' + content + '\r\n\r\n')#单数
    f.write(u'#################### 我是分隔线 ####################\r\n\r\n')

    ########## 获取帖子的评论 ##########
    post_reply1 = doc('div[class="reply-box"]').text().replace(u'| 只看此人 | 不看此人 |','').replace(u'| 举报','').split(u'回帖人:')
    post_reply2 = doc('div[class="reply-box nobg"]').text().replace(u'| 只看此人 | 不看此人 |', '').replace(u'| 举报', '').split(u'回帖人:')
    for reply2 in post_reply2:
        f.write(u'  ' + reply2.strip() + '\r\n\r\n')#双数
    f.write(u'#################### 我是分隔线 ####################\r\n\r\n')
    for reply1 in post_reply1:
        f.write(u'  ' + reply1.strip() + '\r\n\r\n')
    f.write(u'#################### 我是分隔线 ####################\r\n\r\n')

    ########## 处理翻页 ##########
    # 获取翻页链接
    next_page_list = doc('div.pages > div[class="pagesmodule"]>a').items()
    page_list =[]
    try:
        for page in next_page_list:
            page_url = 'http://club.kdnet.net/'+ page.attr.href
            page_list.append(page_url)
        pange_num = len(page_list)/2
        page_list = page_list[0:pange_num]
        for i in range(0,pange_num):
            f.write(u'*********************第%d页*********************' %(i+2) + '\r\n\r\n')
            f.write(u'楼层传送门:' + page_list[i] + '\r\n\r\n')
            page_html = requests.get(page_list[i], headers=headers)
            page_html.encoding = 'GBK'
            page_html = page_html.text
            page_doc = pq(page_html)
            ########## 获取帖子的评论 ##########
            post_reply1 = page_doc('div[class="reply-box"]').text().replace(u'| 只看此人 | 不看此人 |', '').replace(u'| 举报',
                                                                                                       '').split(
                u'回帖人:')
            post_reply2 = page_doc('div[class="reply-box nobg"]').text().replace(u'| 只看此人 | 不看此人 |', '').replace(u'| 举报',
                                                                                                            '').split(
                u'回帖人:')
            for reply2 in post_reply2:
                f.write(u'  ' + reply2.strip() + '\r\n\r\n')  # 双数
            f.write(u'#################### 我是分隔线 ####################\r\n\r\n')
            for reply1 in post_reply1:
                f.write(u'  ' + reply1.strip() + '\r\n\r\n')
            f.write(u'#################### 我是分隔线 ####################\r\n\r\n')
    except:
        print "无翻页信息"

    # 关闭文件
    f.close()


if __name__ == '__main__':
    #atr_url = 'http://club.kdnet.net/dispbbs.asp?boardid=1&id=996436'
    #download_post(atr_url)
    file_path = makedir(u'缠中说禅凯迪排序版2')
    #file_path = makedir(u'欢数学的女孩凯迪排序版2')
    get_atrList(file_path)
    #def download_post(atr_url,atr_name,file_path):
    #download_post('http://club.kdnet.net/dispbbs.asp?boardid=44&id=842629',u'最退步右派也比最厉害左派强上一万倍',u'G://缠中说禅凯迪排序版2')

小结

结果图

缠中说禅凯迪论坛共91篇.png
欢数学的女孩凯迪论坛共121篇.png
上一篇 下一篇

猜你喜欢

热点阅读