文章目錄
1 接口請求
1.1 確定接口地址
因爲只有四個接口需要訪問,且無規律,直接找到寫入templateurl
數組中
#獲取url
templateurl = ['https://movie.douban.com/subject/26873657/comments?start={}&limit=20&sort=new_score&status=P',
'https://movie.douban.com/subject/27602222/comments?start={}&limit=20&sort=new_score&status=P',
'https://movie.douban.com/subject/30441625/comments?start={}&limit=20&sort=new_score&status=P',
'https://movie.douban.com/subject/34861173/comments?start={}&limit=20&sort=new_score&status=P'
]
1.2 封裝接口請求
定義一個接口請求函數,根據獲取到的地址進行請求,並返回獲取的結果。
#下載源代碼
def download_page(url):
#頭
header={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0',
'Cookie':'your cookie'
}
#生成下載源代碼
html = requests.get(url,headers=header).content
#返回下載源代碼
return html
不設置Cookie
的話,只能訪問前10頁。
1.3 循環調用接口
看評論時可發現,每翻一頁可看到規律,如下圖:
start=的值以0開始,每次增加20。
以此爲規律,設置接口地址爲:‘https://movie.douban.com/subject/34861173/comments?start={}&limit=20&sort=new_score&status=P’;
用str.format
函數,將 {} 替換成想要的值
for j in range(len(templateurl)):#循環調用四個接口
#每頁20條,共爬25頁,共計500條
for k in range(25):
targeturl = templateurl[j].format(k * 20)
res = dd.download_page(targeturl)
#設置爬蟲工作間隔時間
time.sleep(float(random.randint(4, 9)) / 20 + float(random.randint(1, 20)) / 20+2)
測試發現豆瓣每次只有500條數據可以看到,所以用range()函數空值範圍;
後續發現第四季剛出,不到500條,用一個判斷來退出循環:判斷解析的結果集沒有數據時,即長度爲0時,break
;
flag=len(username_nodes) + len(comment_nodes) + len(vote_nodes)
#當獲取不到數據時自動退出
if flag==0 :
break
else:
#處理數據
僅用一個字段判斷不行,比如我一開始用的用戶名,後來發現數據只能獲取部分;後來將三個字段的長度相加進行判斷後可以。
2.處理數據
2.1 解析網頁返回結果
用lxml解析器解析頁面,並用BeautifulSoup的select選擇器篩出數據。
#獲取豆瓣短評頁面
#lxml解析器有解析HTML和XML的功能,而且速度快,容錯能力強,所以推薦使用它。
soup = BeautifulSoup(res,"lxml")
#獲取豆瓣短評
comment_nodes = soup.select('.comment > p')
#用戶名
username_nodes = soup.select('.comment > h3 > span.comment-info > a')
#贊同數
vote_nodes = soup.select('.comment > h3 > span.comment-vote > span')
2.2 保存數據
可以保存至 txt文件、csv表格和mysql數據庫;
都試了一下。
2.2.1 保存至 txt文件
首先將獲取的數據預處理拼接
comments_list = []
usernames_list=[]
votes_list=[]
all_list=[]
for i in range(len(comment_nodes)):
str = '用戶名: '+username_nodes[i].get_text() +"||評論:"+comment_nodes[i].get_text().strip().replace("\n", "") +'||vote數量: '+vote_nodes[i].get_text()+ u'\n'
all_list.append(str)
然後file.writelines
寫入txt文件
with codecs.open('嚮往'+str(j+1)+'短評.txt', 'a', encoding='utf-8') as f:
#調用dd的download_page函數獲取評論內容
ps.get_douban_comments(res)
#寫入文件
f.writelines(ps.get_douban_comments(res))
2.2.2 保存至 csv文件
與上面略不同的是保存方式,首先需要設置下列名;
df = pd.DataFrame(columns=['用戶名','評論', 'vote'])
然後在最內層的循環中修改寫入文件方式爲to_csv
,需要注意編碼
#這裏是保存文件
df.loc[i+ k*20]=[username_nodes[i].get_text(),comment_nodes[i].get_text(),vote_nodes[i].get_text()]
# 設置編碼爲utf-8無效,依舊爲亂碼;改爲utf-8-sig後ok
df.to_csv('嚮往'+str(j+1)+'短評.csv', index=False,encoding='utf-8-sig')
2.2.3 保存至MySQL數據庫
首先設置數據庫連接
connection = pymysql.connect(host=host,
port=3306,
user=user,
password=pwd,
db=db_name,
charset='utf8mb4')
在數據庫中建好相應的表,
CREATE TABLE `xwspider1` (
`name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`comments` longtext,
`vote` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
四個表 表結構一致,直接用create table tablename as select * from xwspider1 where 1=2
複製表結構即可。
獲取到接口返回的數據經過selector選擇器後,還需要進一步處理。
- 獲取到的是數組,需要循環遍歷
- 需要數組中的
get_text()
內容 - 因爲數據庫不能保存emoji表情符,需要刪除數據中的emoji
- 評論中的 ’ 符號會與插入數據時 sql語句中的 ’ 衝突,也需要去掉
再調用連接的cursor,執行SQL語句
#這裏存入數據庫
sql = "INSERT into xwspider"+str(j+1)+" ( name,comments,vote) VALUES ( '%s', '%s', '%s')" % (
emoji.demojize(#去掉emoji表情符號
str(username_nodes[i].get_text()).replace("'", "")#去掉'符號
),
emoji.demojize(str(comment_nodes[i].get_text())),
(vote_nodes[i].get_text())
)
cursor.execute(sql)
數據庫結果一覽:
代碼鏈接:
https://github.com/wangjie182/xwspider
- 下載代碼後,首先確保引入的模塊都已經下載
- 然後修改請求文件downloader的Cookie值
- 本地配置好數據庫後,修改db文件的數據庫配置與本地配置一致
數據分析
其實爬蟲不是本意,只是想看看大華在《往生》四季中別人對其評論的變化。
數據截取時間爲 2020/05/09,16:00點。
首先看第一季:
關鍵字篩選:大華 Henry henry 劉憲華
500個記錄中篩選出包含關鍵字的評論,共55條,佔比11%;再取vote前5的評論,
獲取到以下keyword:
- 浪漫 可愛 幽默
- 傻白甜
vote數是 2260,總vote數是 20283,佔比11.14%
同樣的對第二季、第三季的評論進行篩選:
第二季:
500條記錄篩選出80個匹配項,佔比16%,keyword爲:
- 啊哦沒有欸
- 油膩 泰迪 zhizhang
vote數是 3854,總數是 9710,佔比39.69%
第三季:
500條記錄篩選出117個匹配項,佔比23.2%,keyword爲:
- 想大華 需要Henry 沒有他變尷尬、難看
- 聒噪
vote數是 4501,總數是 21438,佔比21%
第四季:
240條記錄篩選出20個匹配項,佔比8.3%,keyword爲:
- 想大華 貼心 搞笑 互動 遺憾
- 啊哦沒有欸
vote數是 181,總數是 1450,佔比12.48%