缠师最早的天涯论坛爬取:https://www.jianshu.com/p/81a5da4fa161
python爬取缠中说禅天涯论坛历史所有文章及回复(一)
前期准备
- 目标地址
- 凯迪贴1:缠中说禅:http://user.kdnet.net/index.asp?userid=648377#post
- 凯迪贴2:欢数学的女孩:http://user.kdnet.net/index.asp?userid=295294#post
- 除了userid不一样和存储文件夹不一样之外,并没有区别,写好一个project改userid然后跑2次就好了
- 数量:全量(全部文章178篇)
- 输出doc或者txt:要求按时间排序、文件名为文章名称
找接口和规律
翻页接口
- 方式一:找到有page数的url尝试打开http://user.kdnet.net/posts.asp?userid=295294&t=0&page=2
- 只需改变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
网友评论