一巫橄、準備工作
安裝requests
pip install requests
二、觀察網(wǎng)頁信息
1.目標網(wǎng)站-->貓眼電影TOP100,可以看到每頁有100個電影窑眯,一共有10頁屏积,每個電影分別有排名、電影名稱磅甩、演員炊林、上映時間、評分渣聚,這是我們需要得到的信息,并且我們只需要循環(huán)10次就好了
2.觀察每一頁的URL,點擊第二頁 https://maoyan.com/board/4?offset=10 我們可以看到后面多了個offset=10谭梗,依次點擊會發(fā)現(xiàn)規(guī)律20凄吏、30.....,那么第一頁會是什么呢?我們猜想會不會是https://maoyan.com/board/4?offset=0 使了一下果然ok,那么簡單嘍
- 構(gòu)造URL函數(shù)
def main(offset):
url='http://maoyan.com/board/4?offset='+str(offset)
html=get_one_page(url)
parser=parser_one_page(html)
for p in parser:
write_to_file(p)
if __name__ == '__main__':
for i in range(10):
main(offset=i*10)
三难咕、構(gòu)建GET請求
- 既然URL我們已經(jīng)有了余佃,那么就方便了直接使用requests的get請求
def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
try:
r=requests.get(url,headers=headers)
r.encoding=r.apparent_encoding
if r.status_code==200:
return r.text
return None
except:
print('shibai')
- 這里面我們使用了headers這個參數(shù)诸蚕,(畢竟要給網(wǎng)站點面子)這個是告訴網(wǎng)站你是個什么東西(好像怪怪的)坏瘩,但是確實我使用的是Chrome瀏覽器和win電腦,如果不設(shè)置這個,網(wǎng)站那邊直接顯示Python程序禁熏,也就是個爬蟲
四隙笆、解析頁面
- 經(jīng)過第三步的操作我們已經(jīng)得到了一個Response對象您访,里面包含了我們所需要的信息灵汪,那么這步我們就是提取出我們需要的信息渗鬼,一共有這么幾個電影的有排名譬胎、電影名稱脐恩、演員镐侯、上映時間袜瞬、評分身堡,話不多說季稳,上代碼
def parser_one_page(html):
partern=re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
item=re.findall(partern,html)
for i in item:
print(i)
yield {
'排名': i[0],
'電影名稱': i[1],
'演員': i[2].strip()[3:],
'上映時間': i[3].strip()[5:],
'評分': i[4] + i[5]
}
-
使用正則表達式通用的 (.*?) 來連接標簽擅这,匹配我們想要的內(nèi)容,經(jīng)過這部分之后會看到控制臺依次輸出
捕獲.JPG
五景鼠、保存爬取的電影信息
- 我們經(jīng)過上一部分已經(jīng)獲得了top100的信息铛漓,下面我們來把獲得的信息保存起來,我這里是存到本地蒸矛,也可存到數(shù)據(jù)庫里席赂,感興趣的可以自己試下
def write_to_file(content):
with open('top100.txt','a',encoding='UTF-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
- 這里保存在你程序的文件夾下癞揉,名字叫做top100以TXT格式,使用UTF-8編碼溺欧,每一行加了換行符喊熟,使用json.dumps對數(shù)據(jù)進行編碼,但是有個問題姐刁,有些文字的ascii 字符碼芥牌,不是真正的中文,這是因為json.dumps 序列化時對中文默認使用的ascii編碼.想輸出真正的中文需要指定ensure_ascii=False
全部代碼-->貓眼電影TOP100github
六聂使、總結(jié)
有這么幾個需要注意的地方
- 針對網(wǎng)站的反爬壁拉,做好反反爬措施
- 正則表達式一定要寫對
- 文件的保存,記得設(shè)置ensure_ascii=False