旅の途中
你知道阿基米德原理吗?

导航

 

无聊写了个豆瓣日记的小爬虫,requests+bs4。
cookies_src可填可不填,主要是为了爬取仅自己可见的日记。
url填写的是日记页面,即https://www.douban.com/people/***/notes

import requests
import re
from bs4 import BeautifulSoup

# cookies
cookies_src=''

# 日记页面
url=''

def parse_cookies(str):
    str_tmp=str.replace(' ','')
    str_list=str.split(';')
    cookies={}
    for item in str_list:
        item_list=item.split('=')
        key=item_list[0]
        value=item_list[1]
        cookies[key]=value
    return cookies

def get_html(url,cookies):
    r=requests.get(url,cookies=cookies)
    return r.text

# 解析日记页面,提取出标题,时间,内容
def parse_diary(src):
    soup=BeautifulSoup(web_html,'html.parser')
    note_container=soup.find('div','note-container')
    title=note_container.find('div','note-header note-header-container').h1.text
    time=note_container.find('span','pub-date').text
    content=''
    contents=note_container.find('div',id='link-report')
    text=str(contents).replace('<br>','\n')
    text=text.replace('<p>','')
    text=text.replace('</p>','\n')
    text=text.replace('<div class="note" id="link-report">','')
    text=text.replace('</div>','')
    content=content+text
    return (title,time,content)


cookies=parse_cookies(cookies_src)

# 提取处所有日记链接
next_page=url
diarys_link=[]
page_num=1
while True:
    print("正在获取第%d页的日记链接..."%page_num)
    web_html=get_html(next_page,cookies)
    soup=BeautifulSoup(web_html,'html.parser')
    # 将当前页面的日记链接保存于diarys_link中
    for rr in soup.find_all('div','rr'):
        diarys_link.append(rr.a['href'])
    try: # 到达最后一页
        next_page=soup.find('span','next').a['href']
    except:
        break
    page_num=page_num+1

# 解析每条日记
print('逐条解析日记...')
diarys=[]
num=1
for diary in diarys_link:
    web_html=get_html(diary,cookies)
    diarys.append(parse_diary(web_html))
    print('已解析:%d'%num)
    num=num+1

# 写入文件
print('写入文件中...')
with open('./diary.txt','w') as f:
    for diary in diarys:
        f.write(diary[0])
        f.write('\n')
        f.write(diary[1])
        f.write('\n')
        f.write(diary[2])
        f.write('\n---------------------------------\n')

print('写入成功')

关于日记内容的处理部分,本来是可以直接用.text来获取的,但<br><p>标签均被过滤掉,原文中的换行符就没了,所以只能转换成str再进行替换了。

posted on 2017-09-30 21:48  CknightX  阅读(404)  评论(0编辑  收藏  举报