python爬取豆瓣个人主页观影和读书记录

2019-03-03  本文已影响0人  哦哟哟

过年的时候,抽空自学了一下网络爬虫,想着做点什么实践练手。于是想到豆瓣个人主页上的电影和读书记录也有好几百了,想要自己本地保存时,一个一个粘贴复制费时,不如用一段小代码可以一下子全部拉出来。网上我自己看到的是一些利用正则表达式解析豆瓣主页信息的,在这里我用了BeautifulSoup模块解析,非常强大方便。
注意

1).start_link是你的主页域名,请自行输入,可以在“你的域名”位置输入自己的主页域名。域名在自己的豆瓣主页上可以看到https://www.douban.com/people/你的域名/
2).depth是页数,这里我写的是自己的真实页数,也可以写一个很大的数让他能包括所有页就行

1.电影记录

import requests
from bs4 import BeautifulSoup
import pandas as pd

def GetMovieList(link):
    res=requests.get(link)
    res.encoding='utf-8'
    soup=BeautifulSoup(res.text)
    movies=[]
    for movie in soup.select('a em'):
        movies.append(str(movie.text))
    dates=[]
    for date in soup.select('span[class="date"]'):
         dates.append(str(date.text))
    tags=[]
    for tag in soup.select('span[class="tags"]'):
         tags.append(str(tag.text))
    results={}
    results['movie']=movies
    results['date']=dates
    results['tag']=tags
    return results

start_link = 'https://movie.douban.com/people/你的域名/collect?start='#请自行更改为自己的主页域名
depth =11#你的页数
lists={'MOVIE':[],'DATE':[],'TAG':[]}
for i in range(depth):
    link= start_link + str(15*i)
    list=GetMovieList(link)
    lists['MOVIE'].extend(list['movie'])
    lists['DATE'].extend(list['date'])
    lists['TAG'].extend(list['tag'])

pd.set_option('display.max_rows', None)#显示所有行
df_movie=pd.DataFrame(lists)
df_movie

输出结果
我用的是jupyter notebook,由于跟pandas的整合,结果用DataFrame输出效果很好

豆瓣电影观影记录.jpg

2.读书记录
读书记录的爬取基本跟电影基本一致,有3个注意的地方:

1).request的时候发现仅仅用网址无法获得,于是加上了headers才能获取
2).在headers的Referer有豆瓣主页网址,请自行修改你的域名
3).书名books列表解析的时候发现会把自定义的标签选出来了,加了一小段代码去除了自定义标签

import requests
from bs4 import BeautifulSoup
import pandas as pd

def GetBookList(link):
    res=requests.get(link,headers=headers)
    res.encoding='utf-8'
    soup=BeautifulSoup(res.text)
    dates=[]
    for date in soup.select('span[class="date"]'):
         dates.append(str(date.text).replace('\n','').replace('读过',''))
    tags=[]
    for tag in soup.select('span[class="tags"]'):
         tags.append(str(tag.text))
    books=[]
    for book in soup.select('a[title]'):
        books.append(str(book.text).replace('\n','').replace(' ',''))
    for i in range(len(books)-len(dates)):#去掉爬取到的多余的自定义标签名称
        books.pop()
    results={}
    results['book']=books
    results['date']=dates
    results['tag']=tags
    return results

start_link = 'https://book.douban.com/people/你的域名/collect?start='#自行修改你的域名
headers = {
    "Host": "book.douban.com",
    "Referer":"https://www.douban.com/people/你的域名/",
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}#在Referer里修改你的域名
depth =8#你的页数
lists={'BOOK':[],'DATE':[],'TAG':[]}
for i in range(depth):
    link= start_link + str(15*i)
    list=GetBookList(link)
    lists['BOOK'].extend(list['book'])
    lists['DATE'].extend(list['date'])
    lists['TAG'].extend(list['tag'])

pd.set_option('display.max_rows', None)
df_book=pd.DataFrame(lists)
df_book
上一篇 下一篇

猜你喜欢

热点阅读