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

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

作者: 喵鸢 | 来源:发表于2019-01-09 17:07 被阅读12次

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

前期准备

  • 目标地址
  • 数量:全量(全部文章178篇)
  • 输出doc或者txt:要求按时间排序、文件名为文章名称

找接口和规律

翻页接口

  • 只需改变userid和page即可
  • 方式二:Charles第一次做的时候,当时我并没有留意那些没有response的接口,用Charles的是点击翻页直接抓到了接口
  • 直接网页上抓包
  • 凯迪翻页接口

单个文章接口

单个文章url获取

同一文章中的评论翻页

文章内评论翻页url获取

解决思路

  • 1.获取文章列表中每页的文章标题、文章url、文章时间
  • 2.单篇文章信息写入txt:标题、时间、正文
  • 3.单篇文章评论写入txt:发现规律,单数楼层的class一样,双数楼层的class一样,简单说就是一样底色的评论是一类


    凯迪评论规律.png
  • 4.评论翻页:重复步骤3

代码

#!/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')

小结

  • 读写txt流程参考是天涯
  • 缺点:回复里的回复没有加载
  • 缺点:评论楼层是双数在一块单数在一块,这个我还没有好方法优化
  • 注意:txt的文件名称要用列表里显示的时间,当参数传到下载函数里!!!当标题名称一样的时候,点击进去之后的显示的时间和在列表里的不一样,我就遇到了这个问题,导致121篇只爬了120篇;eg:“最退步右派也比最厉害左派强上一万倍”这篇在page=4的时候有出现两篇,这两篇文章url不同,列表里的时间不同,文章里的时间相同,所以txt文档的时间要选用列表里的时间作为参数,大家可以自己试试。有问题欢迎一起解决

结果图

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

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/qyjgrqtx.html