过年的时候,抽空自学了一下网络爬虫,想着做点什么实践练手。于是想到豆瓣个人主页上的电影和读书记录也有好几百了,想要自己本地保存时,一个一个粘贴复制费时,不如用一段小代码可以一下子全部拉出来。网上我自己看到的是一些利用正则表达式解析豆瓣主页信息的,在这里我用了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输出效果很好
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
网友评论