一個(gè)入門級(jí)python爬蟲教程詳解
前言
本文目的:根據(jù)本人的習(xí)慣與理解,用最簡(jiǎn)潔的表述,介紹爬蟲的定義、組成部分、爬取流程,并講解示例代碼。
基礎(chǔ)
爬蟲的定義:定向抓取互聯(lián)網(wǎng)內(nèi)容(大部分為網(wǎng)頁)、并進(jìn)行自動(dòng)化數(shù)據(jù)處理的程序。主要用于對(duì)松散的海量信息進(jìn)行收集和結(jié)構(gòu)化處理,為數(shù)據(jù)分析和挖掘提供原材料。
今日t條就是一只巨大的“爬蟲”。
爬蟲由URL庫、采集器、解析器組成。
流程
如果待爬取的url庫不為空,采集器會(huì)自動(dòng)爬取相關(guān)內(nèi)容,并將結(jié)果給到解析器,解析器提取目標(biāo)內(nèi)容后進(jìn)行寫入文件或入庫等操作。
代碼
第一步:寫一個(gè)采集器
如下是一個(gè)比較簡(jiǎn)單的采集器函數(shù)。需要用到requests庫。
首先,構(gòu)造一個(gè)http的header,里面有瀏覽器和操作系統(tǒng)等信息。如果沒有這個(gè)偽造的header,可能會(huì)被目標(biāo)網(wǎng)站的WAF等防護(hù)設(shè)備識(shí)別為機(jī)器代碼并干掉。
然后,用requests庫的get方法獲取url內(nèi)容。如果http響應(yīng)代碼是200 ok,說明頁面訪問正常,將該函數(shù)返回值設(shè)置為文本形式的html代碼內(nèi)容。
如果響應(yīng)代碼不是200 ok,說明頁面不能正常訪問,將函數(shù)返回值設(shè)置為特殊字符串或代碼。
import requests def get_page(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'} response = requests.get(url, headers= headers) if response.status_code == 200: return response.text else: return 'GET HTML ERROR !'
第二步:解析器
解析器的作用是對(duì)采集器返回的html代碼進(jìn)行過濾篩選,提取需要的內(nèi)容。
作為一個(gè)14年忠實(shí)用戶,當(dāng)然要用豆瓣舉個(gè)栗子 _
我們計(jì)劃爬取豆瓣排名TOP250電影的8個(gè)參數(shù):排名、電影url鏈接、電影名稱、導(dǎo)演、上映年份、國家、影片類型、評(píng)分。整理成字典并寫入文本文件。
待爬取的頁面如下,每個(gè)頁面包括25部電影,共計(jì)10個(gè)頁面。
在這里,必須要表揚(yáng)豆瓣的前端工程師們,html標(biāo)簽排版非常工整具有層次,非常便于信息提取。
下面是“肖申克的救贖”所對(duì)應(yīng)的html代碼:(需要提取的8個(gè)參數(shù)用紅線標(biāo)注)
根據(jù)上面的html編寫解析器函數(shù),提取8個(gè)字段。該函數(shù)返回值是一個(gè)可迭代的序列。
我個(gè)人喜歡用re(正則表達(dá)式)提取內(nèi)容。8個(gè)(.*?)分別對(duì)應(yīng)需要提取的字段。
import re def parse_page(html): pattern = re.compile('<em class="">(.*?)</em>.*?<a href="(.*?)" rel="external nofollow" rel="external nofollow" >.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?<p class="">(.*?) .*?<br>(.*?) / (.*?) / (.*?)</p>.*?<span class="rating_num".*?"v:average">(.*?)</span>' , re.S) items = re.findall(pattern , html) for item in items: yield { 'rank': item[0], 'href': item[1], 'name': item[2], 'director': item[3].strip()[4:], 'year': item[4].strip(), 'country': item[5].strip(), 'style': item[6].strip(), 'score': item[7].strip() }
提取后的內(nèi)容如下:
整理成完整的代碼:(暫不考慮容錯(cuò))
import requests import re import json def get_page(url): #采集器函數(shù) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'} response = requests.get(url, headers= headers) if response.status_code == 200: return response.text else: return 'GET HTML ERROR ! ' def parse_page(html): #解析器函數(shù) pattern = re.compile('<em class="">(.*?)</em>.*?<a href="(.*?)" rel="external nofollow" rel="external nofollow" >.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?<p class="">(.*?) .*?<br>(.*?) / (.*?) / (.*?)</p>.*?<span class="rating_num".*?"v:average">(.*?)</span>' , re.S) items = re.findall(pattern , html) for item in items: yield { 'rank': item[0], 'href': item[1], 'name': item[2], 'director': item[3].strip()[4:], 'year': item[4].strip(), 'country': item[5].strip(), 'style': item[6].strip(), 'score': item[7].strip() } def write_to_file(content): #寫入文件函數(shù) with open('result.txt' , 'a' , encoding = 'utf-8') as file: file.write(json.dumps(content , ensure_ascii = False) + '\n') if __name__== "__main__": # 主程序 for i in range(10): url= 'https://movie.douban.com/top250?start='+ str(i*25)+ '&filter' for res in parse_page(get_page(url)): write_to_file(res)
非常簡(jiǎn)潔,非常符合python簡(jiǎn)單、高效的特點(diǎn)。
說明:
需要掌握待爬取url的規(guī)律,才能利用for循環(huán)等操作自動(dòng)化處理。
前25部影片的url是https://movie.douban.com/top250?start=0&filter,第26-50部影片url是https://movie.douban.com/top250?start=25&filter。規(guī)律就在start參數(shù),將start依次設(shè)置為0、25、50、75。。。225,就能獲取所有頁面的鏈接。parse_page函數(shù)的返回值是一個(gè)可迭代序列,可以理解為字典的集合。運(yùn)行完成后,會(huì)在程序同目錄生成result.txt文件。內(nèi)容如下:
到此這篇關(guān)于一個(gè)入門級(jí)python爬蟲教程詳解的文章就介紹到這了,更多相關(guān)python爬蟲入門教程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
為Python的web框架編寫MVC配置來使其運(yùn)行的教程
這篇文章主要介紹了為Python的web框架編寫MVC配置來使其運(yùn)行的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04python+selenium行為鏈登錄12306(滑動(dòng)驗(yàn)證碼滑塊)
這篇文章主要介紹了python+selenium行為鏈登錄12306,使用python網(wǎng)絡(luò)爬蟲登錄12306,下面小編為大家分享一段代碼,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-02-02Python面向?qū)ο笾瓷?自省機(jī)制實(shí)例分析
這篇文章主要介紹了Python面向?qū)ο笾瓷?自省機(jī)制,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中的反射/自省機(jī)制概念、原理及相關(guān)屬性操作技巧,需要的朋友可以參考下2018-08-08Python如何將數(shù)字變成帶逗號(hào)的千分位
這篇文章主要介紹了Python如何將數(shù)字變成帶逗號(hào)的千分位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Selenium關(guān)閉INFO:CONSOLE提示的解決
這篇文章主要介紹了Selenium關(guān)閉INFO:CONSOLE提示的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5信號(hào)與槽的連接
本文講解信號(hào)與槽的連接機(jī)制,詳細(xì)示范各種類型的信號(hào)/槽連接的實(shí)現(xiàn)方法,這是圖形用戶界面的核心內(nèi)容。還將介紹面向?qū)ο蟮某绦蛟O(shè)計(jì),這是圖形用戶界面的基本思想2021-10-10python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù))
這篇文章主要介紹了python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07Python中print函數(shù)簡(jiǎn)單使用總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Python中怎么使用print函數(shù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2019-08-08Python實(shí)現(xiàn)爆破ZIP文件(支持純數(shù)字,數(shù)字+字母,密碼本)
這篇文章主要為大家分享了如何利用Python實(shí)現(xiàn)破解zip文件的密碼,能實(shí)現(xiàn)破解純數(shù)字、數(shù)字+字母、密碼本等種類的密碼,需要的可以參考一下2022-03-03