去年就說(shuō)要看一看 python(其實(shí)去年還說(shuō)要看C++/JavaScript)脓魏,看了一點(diǎn)兒語(yǔ)法之后一直沒再碰過了甘耿。最近寫 Android 寫的頭昏腦漲勇边,決定看點(diǎn) python 換下腦子锚沸。由于暫時(shí)打算用python玩一下第晰,所以就不深入追究語(yǔ)言細(xì)節(jié)碱茁,只做一些有趣的事情裸卫。本文將簡(jiǎn)單的提及以下內(nèi)容:
- requests
- BeautifulSoup
- python io
用 Python 做什么
這里打算通過分析 豆瓣電影TOP250網(wǎng)頁(yè)來(lái)提取一些電影信息,通過干這件事來(lái)對(duì) python 的 io 纽竣、http 請(qǐng)求方式做一些簡(jiǎn)單的了解墓贿。分析網(wǎng)頁(yè)這里選擇使用 Beautiful Soup 來(lái)做標(biāo)簽解析,請(qǐng)求庫(kù)選用 requests蜓氨。
準(zhǔn)備工作
- 閱讀 requests 文檔
這里的目標(biāo)是拿到網(wǎng)頁(yè)聋袋,也就是html,然后分析提取內(nèi)容穴吹,這里的目標(biāo)網(wǎng)頁(yè)沒有什么特殊的驗(yàn)證機(jī)制幽勒,所以只需要通過 http 協(xié)議中的 get 請(qǐng)求方式獲取網(wǎng)頁(yè)響應(yīng)就可以了。
r = requests.get('https://github.com/timeline.json')
這里就要好好的看看了港令,因?yàn)樘崛⌒畔⑿枰玫竭@個(gè)庫(kù)啥容。這里我做了一些簡(jiǎn)單的了解,這個(gè)庫(kù)遍歷了 html 生成了一個(gè) python 對(duì)象顷霹,后續(xù)的解析就通過這個(gè)對(duì)象來(lái)完成咪惠。由于不了解這個(gè)庫(kù)的實(shí)現(xiàn)方式,所以還是有些擔(dān)憂效率的泼返,因?yàn)?html 這種嵌套層級(jí)可能非常多的東西硝逢,生成的類查找效率可能堪憂。不過現(xiàn)在也不想去考慮這些問題绅喉,暫時(shí)先用著~
分析主要就是分析一下一些自己感興趣信息的標(biāo)簽和屬性渠鸽,以此為鍵提取出相應(yīng)的值。分析網(wǎng)頁(yè)自帶的開發(fā)者工具真的是十分的好用柴罐,因?yàn)檫@里的網(wǎng)頁(yè)比較簡(jiǎn)單徽缚,在點(diǎn)擊切換界面的時(shí)候發(fā)現(xiàn)網(wǎng)頁(yè)鏈接 url 變化如下:
https://movie.douban.com/top250 ->
https://movie.douban.com/top250?start=25
nice,很簡(jiǎn)單革屠,想拿到全部250部電影信息只需要改變url的start參數(shù)值就可以了凿试。這里是簡(jiǎn)單的通過 get 請(qǐng)求傳參排宰,如果是 post 或者一些其他的方式傳參數(shù),就需要我們通過抓包工具去抓包分析數(shù)據(jù)包那婉。
編寫代碼
代碼其實(shí)非常簡(jiǎn)單板甘,如果按照我前面說(shuō)的步驟來(lái),基本不需要我做什么過多累贅的解釋(所以這里我就不做過多的解釋了):
# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup
import requests
count = 0
FILE_PATH = '豆瓣電影TOP250.txt'
def getMovieList():
global count
resp = requests.get('https://movie.douban.com/top250?start=' + str(count))
bs = BeautifulSoup(resp.text, 'html.parser')
for item in bs.find_all('div', {'class': 'item'}):
title = item.find('span', {'class': 'title'}).get_text()
rating_num = item.find('span', {'class': 'rating_num'}).get_text()
img = item.find('img')['src']
tag = item.find('span', {'class': 'inq'})
if tag is not None:
desc = tag.get_text()
print('標(biāo)題:', title, ' 評(píng)分:', rating_num, ' 描述:', desc, ' image_url:', img)
# img = item.find('div', {'class': 'pic'}).find("a").get_text()
# print(title, img)
f.writelines('標(biāo)題:' + title + ' 評(píng)分:' + rating_num + ' 描述:' + desc + ' image_url:' + img+"\n\n")
count += 25
if count >= 255:
print('獲取完畢')
else:
getMovieList()
f = open(FILE_PATH, 'w+', encoding='utf-8')
getMovieList()
f.close()
輸出結(jié)果:
這里其實(shí)可以開多線程去訪問详炬,但是我對(duì)于 python 中的線程與線程安全還不是非常了解盐类,等下一次再玩玩。