教你如何使用Python快速爬取需要的數(shù)據(jù)
一、基礎(chǔ)第三方庫(kù)使用
1.基本使用方法
"""例""" from urllib import request response = request.urlopen(r'http://bbs.pinggu.org/') #返回狀態(tài) 200證明訪問(wèn)成功 print("返回狀態(tài)碼: "+str(response.status)) #讀取頁(yè)面信息轉(zhuǎn)換文本并進(jìn)行解碼,如果本身是UTF-8就不要,具體看頁(yè)面格式 #搜索“charset”查看編碼格式 response.read().decode('gbk')[:100]
2.Request
使用request()來(lái)包裝請(qǐng)求,再通過(guò)urlopen()獲取頁(yè)面。俗稱偽裝。讓服務(wù)器知道我們是通過(guò)瀏覽器來(lái)訪問(wèn)的頁(yè)面,有些情況可能會(huì)被直接斃掉。
url = r'http://bbs.pinggu.org/' headers = {'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3', 'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label', 'Connection': 'keep-alive'} req = request.Request(url, headers=headers) page = request.urlopen(req).read() page = page.decode('gbk') page[:100]
包含data的方法。
import urllib.parse url = r'https://new-api.meiqia.com/v1/throttle/web?api_name=%2Fvisit%2Finit&ent_id=7276&v=1534848690048' headers = {'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3', 'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label', 'Connection': 'keep-alive'} values={'api_name':'/visit/init','ent_id':'7276','v':'1534848690048'} data = urllib.parse.urlencode(values).encode(encoding='UTF8') req = request.Request(url, data,headers=headers) page = request.urlopen(req).read() page = page.decode('gbk')
3.異常處理
from urllib.request import Request, urlopen from urllib.error import URLError, HTTPError req = Request("http://www.jb51.net /") try: response = urlopen(req) except HTTPError as e: print('服務(wù)器無(wú)法滿足請(qǐng)求.') print('錯(cuò)誤代碼: ', e.code) except URLError as e: print('不能訪問(wèn)服務(wù)器.') print('原因: ', e.reason) else: print("OK!") print(response.read().decode("utf8"))
from urllib.request import Request, urlopen from urllib.error import URLError req = Request("http://www.jb51.net /") try: response = urlopen(req) except URLError as e: if hasattr(e, '原因'): print('不能訪問(wèn)服務(wù)器.') print('原因: ', e.reason) elif hasattr(e, '代碼'): print('服務(wù)器無(wú)法滿足請(qǐng)求.') print('錯(cuò)誤代碼: ', e.code) else: print("OK!") print(response.read().decode("utf8"))
4.HTTP認(rèn)證
import urllib.request # 私密代理授權(quán)的賬戶 user = "user_name" # 私密代理授權(quán)的密碼 passwd = "uesr_password" # 代理IP地址 比如可以使用百度西刺代理隨便選擇即可 proxyserver = "177.87.168.97:53281" # 1. 構(gòu)建一個(gè)密碼管理對(duì)象,用來(lái)保存需要處理的用戶名和密碼 passwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() # 2. 添加賬戶信息,第一個(gè)參數(shù)realm是與遠(yuǎn)程服務(wù)器相關(guān)的域信息,一般沒(méi)人管它都是寫(xiě)None,后面三個(gè)參數(shù)分別是 代理服務(wù)器、用戶名、密碼 passwdmgr.add_password(None, proxyserver, user, passwd) # 3. 構(gòu)建一個(gè)代理基礎(chǔ)用戶名/密碼驗(yàn)證的ProxyBasicAuthHandler處理器對(duì)象,參數(shù)是創(chuàng)建的密碼管理對(duì)象 #注意,這里不再使用普通ProxyHandler類了 proxyauth_handler = urllib.request.ProxyBasicAuthHandler(passwdmgr) # 4. 通過(guò) build_opener()方法使用這些代理Handler對(duì)象,創(chuàng)建自定義opener對(duì)象,參數(shù)包括構(gòu)建的 proxy_handler 和 proxyauth_handler opener = urllib.request.build_opener(proxyauth_handler) # 5. 構(gòu)造Request 請(qǐng)求 request = urllib.request.Request("http://bbs.pinggu.org/") # 6. 使用自定義opener發(fā)送請(qǐng)求 response = opener.open(request) # 7. 打印響應(yīng)內(nèi)容 print (response.read())
5.ROBOT協(xié)議
目標(biāo)網(wǎng)址后加/robots.txt,例如:https://www.jd.com/robots.txt
第一個(gè)的意思就是說(shuō)對(duì)于所有的爬蟲(chóng),不能爬取在/?開(kāi)頭的路徑,也不能訪問(wèn)和/pop/*.html 匹配的路徑。
后面四個(gè)用戶代理的爬蟲(chóng)不允許訪問(wèn)任何資源。
所以Robots協(xié)議的基本語(yǔ)法如下:
- User-agent: 這里是爬蟲(chóng)的名字
- Disallow: /該爬蟲(chóng)不允許訪問(wèn)的內(nèi)容。
二、爬蟲(chóng)的網(wǎng)頁(yè)抓取
1.爬蟲(chóng)的用途
實(shí)現(xiàn)瀏覽器的功能,通過(guò)制定的URL,直接返回用戶所需要的數(shù)據(jù)。
一般步驟:
- 查找域名對(duì)應(yīng)的IP地址 (比如:119.75.217.109是哪個(gè)網(wǎng)站?)。
- 向?qū)?yīng)的IP地址發(fā)送get或者post請(qǐng)求。
- 服務(wù)器相應(yīng)結(jié)果200,返回網(wǎng)頁(yè)內(nèi)容。
- 開(kāi)始抓你想要的東西吧。
2.網(wǎng)頁(yè)分析
獲取對(duì)應(yīng)內(nèi)容之后進(jìn)行分析,其實(shí)就需要對(duì)一個(gè)文本進(jìn)行處理,把你需要的內(nèi)容從網(wǎng)頁(yè)中的代碼中提取出來(lái)的過(guò)程。BeautifulSoup可實(shí)現(xiàn)慣用的文檔導(dǎo)航、查找、修改文檔功能。如果lib文件夾下沒(méi)有BeautifulSoup的使用命令行安裝即可。
pip install BeautifulSoup
3.數(shù)據(jù)提取
# 想要抓取我們需要的東西需要進(jìn)行定位,尋找到標(biāo)志 from bs4 import BeautifulSoup soup = BeautifulSoup('<meta content="all" name="robots" />',"html.parser") tag=soup.meta # tag的類別 type(tag) >>> bs4.element.Tag # tag的name屬性 tag.name >>> 'meta' # attributes屬性 tag.attrs >>> {'content': 'all', 'name': 'robots'} # BeautifulSoup屬性 type(soup) >>> bs4.BeautifulSoup soup.name >>> '[document]' # 字符串的提取 markup='<b><a rel="external nofollow" target="_blank">房產(chǎn)</a></b>' soup=BeautifulSoup(markup,"lxml") text=soup.b.string text >>> '房產(chǎn)' type(text) >>> bs4.element.NavigableString
4.BeautifulSoup 應(yīng)用舉例
import requests from bs4 import BeautifulSoup url = "http://www.cwestc.com/MroeNews.aspx?gd=2" html = requests.get(url) soup = BeautifulSoup(html.text,"lxml")
#通過(guò)頁(yè)面解析得到結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理 from bs4 import BeautifulSoup soup=BeautifulSoup(html.text,"lxml") #定位 lptable = soup.find('table',width='780') # 解析 for i in lptable.find_all("td",width="680"): title = i.b.strong.a.text ] # href = i.find('a')['href'] date = href.split("/")[4] print (title,href,date)
4.Xpath 應(yīng)用舉例
XPath 是一門在 XML 文檔中查找信息的語(yǔ)言。XPath 可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上。
四種標(biāo)簽的使用方法
- // 雙斜杠 定位根節(jié)點(diǎn),會(huì)對(duì)全文進(jìn)行掃描,在文檔中選取所有符合條件的內(nèi)容,以列表的形式返回。
- / 單斜杠 尋找當(dāng)前標(biāo)簽路徑的下一層路徑標(biāo)簽或者對(duì)當(dāng)前路標(biāo)簽內(nèi)容進(jìn)行操作
- /text() 獲取當(dāng)前路徑下的文本內(nèi)容
- /@xxxx 提取當(dāng)前路徑下標(biāo)簽的屬性值
- | 可選符 使用|可選取若干個(gè)路徑 如//p | //div 即在當(dāng)前路徑下選取所有符合條件的p標(biāo)簽和div標(biāo)簽。
- . 點(diǎn) 用來(lái)選取當(dāng)前節(jié)點(diǎn)
- … 雙點(diǎn) 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
from lxml import etree html=""" <!DOCTYPE html> <html> <head lang="en"> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <div id="content"> <ul id="ul"> <li>NO.1</li> <li>NO.2</li> <li>NO.3</li> </ul> <ul id="ul2"> <li>one</li> <li>two</li> </ul> </div> <div id="url"> <a rel="external nofollow" title="crossgate">crossgate</a> <a rel="external nofollow" title="pinggu">pinggu</a> </div> </body> </html> """ #這里使用id屬性來(lái)定位哪個(gè)div和ul被匹配 使用text()獲取文本內(nèi)容 selector=etree.HTML(html) content=selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()') for i in content: print (i)
#這里使用//從全文中定位符合條件的a標(biāo)簽,使用“@標(biāo)簽屬性”獲取a便簽的href屬性值 con=selector.xpath('//a/@href') for i in con: print (i)
#使用絕對(duì)路徑 #使用相對(duì)路徑定位 兩者效果是一樣的 con=selector.xpath('/html/body/div/a/@title') print (len(con)) print (con[0],con[1])
三、動(dòng)態(tài)網(wǎng)頁(yè)和靜態(tài)網(wǎng)頁(yè)的區(qū)分
來(lái)源百度:
靜態(tài)網(wǎng)頁(yè)的基本概述
靜態(tài)網(wǎng)頁(yè)的網(wǎng)址形式通常是以.htm、.html、.shtml、.xml等為后后綴的。靜態(tài)網(wǎng)頁(yè),一般來(lái)說(shuō)是最簡(jiǎn)單的HTML網(wǎng)頁(yè),服務(wù)器端和客戶端是一樣的,而且沒(méi)有腳本和小程序,所以它不能動(dòng)。在HTML格式的網(wǎng)頁(yè)上,也可以出現(xiàn)各種動(dòng)態(tài)的效果,如.GIF格式的動(dòng)畫(huà)、FLASH、滾動(dòng)字母等,這些“動(dòng)態(tài)效果”只是視覺(jué)上的,與下面將要介紹的動(dòng)態(tài)網(wǎng)頁(yè)是不同的概念。
靜態(tài)網(wǎng)頁(yè)的特點(diǎn)
- 靜態(tài)網(wǎng)頁(yè)每個(gè)網(wǎng)頁(yè)都有一個(gè)固定的URL,且網(wǎng)頁(yè)URL以.htm、.html、.shtml等常見(jiàn)形式為后綴,而不含有“?”。
- 網(wǎng)頁(yè)內(nèi)容一經(jīng)發(fā)布到網(wǎng)站服務(wù)器上,無(wú)論是否有用戶訪問(wèn),每個(gè)靜態(tài)網(wǎng)頁(yè)的內(nèi)容都是保存在網(wǎng)站服務(wù)器上的,也就是說(shuō),靜態(tài)網(wǎng)頁(yè)是實(shí)實(shí)在在保存在服務(wù)器上的文件,每個(gè)網(wǎng)頁(yè)都是一個(gè)獨(dú)立的文件。
- 靜態(tài)網(wǎng)頁(yè)的內(nèi)容相對(duì)穩(wěn)定,因此容易被搜索引擎檢索。
- 靜態(tài)網(wǎng)頁(yè)沒(méi)有數(shù)據(jù)庫(kù)的支持,在網(wǎng)站制作和維護(hù)方面工作量較大,因此當(dāng)網(wǎng)站信息量很大時(shí)完全依靠靜態(tài)網(wǎng)頁(yè)制作方式比較困難。
- 靜態(tài)網(wǎng)頁(yè)的交互性交叉,在功能方面有較大的限制。
動(dòng)態(tài)網(wǎng)頁(yè)的基本概述
動(dòng)態(tài)網(wǎng)頁(yè)是以.asp、.jsp、.php、.perl、.cgi等形式為后綴,并且在動(dòng)態(tài)網(wǎng)頁(yè)網(wǎng)址中有一個(gè)標(biāo)志性的符號(hào)——“?”。動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)上的“動(dòng)態(tài)效果”沒(méi)有直接關(guān)系,動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文字內(nèi)容的,也可以是包含各種動(dòng)畫(huà)的內(nèi)容,這些只是網(wǎng)頁(yè)具體內(nèi)容的表現(xiàn)形式,無(wú)論網(wǎng)頁(yè)是否具有動(dòng)態(tài)效果,采用動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè)都稱為動(dòng)態(tài)網(wǎng)頁(yè).動(dòng)態(tài)網(wǎng)站也可以采用靜動(dòng)結(jié)合的原則,適合采用動(dòng)態(tài)網(wǎng)頁(yè)的地方用動(dòng)態(tài)網(wǎng)頁(yè),如果必要使用靜態(tài)網(wǎng)頁(yè),則可以考慮用靜態(tài)網(wǎng)頁(yè)的方法來(lái)實(shí)現(xiàn),在同一個(gè)網(wǎng)站上,動(dòng)態(tài)網(wǎng)頁(yè)內(nèi)容和靜態(tài)網(wǎng)頁(yè)內(nèi)容同時(shí)存在也是很常見(jiàn)的事情。
動(dòng)態(tài)網(wǎng)頁(yè)應(yīng)該具有以下幾點(diǎn)特色:
- 交互性:即網(wǎng)頁(yè)會(huì)根據(jù)用戶的要求和選擇而動(dòng)態(tài)改變和響應(yīng)。例如訪問(wèn)者在網(wǎng)頁(yè)填寫(xiě)表單信息并提交,服務(wù)器經(jīng)過(guò)處理將信息自動(dòng)存儲(chǔ)到后臺(tái)數(shù)據(jù)庫(kù)中,并打開(kāi)相應(yīng)提示頁(yè)面。
- 自動(dòng)更新:即無(wú)需手動(dòng)操作,便會(huì)自動(dòng)生成新的頁(yè)面,可以大大節(jié)省工作量。例如,在論壇中發(fā)布信息,后臺(tái)服務(wù)器將自動(dòng)生成新的網(wǎng)頁(yè)。
- 隨機(jī)性:即當(dāng)不問(wèn)的時(shí)間、不問(wèn)的人訪問(wèn)同一網(wǎng)址時(shí)會(huì)產(chǎn)生不同的頁(yè)面效果。例如,登錄界面自動(dòng)循環(huán)功能。
- 動(dòng)態(tài)網(wǎng)頁(yè)中的“?”對(duì)搜索引擎檢索存在一定的問(wèn)題,搜索引擎一般不可能從一個(gè)網(wǎng)站的數(shù)據(jù)庫(kù)中訪問(wèn)全部網(wǎng)頁(yè),或者出于技術(shù)方面的考慮,搜索蜘蛛不去抓取網(wǎng)址中“?”后面的內(nèi)容,因此采用動(dòng)態(tài)網(wǎng)頁(yè)的網(wǎng)站在進(jìn)行搜索引擎推廣時(shí)需要做一定的技術(shù)處理才能適應(yīng)搜索引擎的要求。
總結(jié)來(lái)說(shuō):頁(yè)面內(nèi)容變了網(wǎng)址也會(huì)跟著變基本都是靜態(tài)網(wǎng)頁(yè),反之是動(dòng)態(tài)網(wǎng)頁(yè)。
四、動(dòng)態(tài)網(wǎng)頁(yè)和靜態(tài)網(wǎng)頁(yè)的抓取
1.靜態(tài)網(wǎng)頁(yè)
import requests from bs4 import BeautifulSoup url = "http://www.cwestc.com/MroeNews.aspx?gd=1" html = requests.get(url) soup = BeautifulSoup(html.text,"lxml") soup.text[1900:2000]
import requests from bs4 import BeautifulSoup url = "http://www.cwestc.com/MroeNews.aspx?gd=2" html = requests.get(url) soup = BeautifulSoup(html.text,"lxml") soup.text[1900:2000]
總結(jié):上面2個(gè)url差別在最后一個(gè)數(shù)字,在原網(wǎng)頁(yè)上每點(diǎn)下一頁(yè)網(wǎng)址和內(nèi)容同時(shí)變化,我們判斷:該網(wǎng)頁(yè)為靜態(tài)網(wǎng)頁(yè)。
2.動(dòng)態(tài)網(wǎng)頁(yè)
import requests from bs4 import BeautifulSoup url = "http://news.cqcoal.com/blank/nl.jsp?tid=238" html = requests.get(url) soup = BeautifulSoup(html.text,"lxml") soup.text
抓取該網(wǎng)頁(yè)看不到任何的信息證明是動(dòng)態(tài)網(wǎng)頁(yè),正確抓取方法如下。
import urllib import urllib.request import requests url = "http://news.cqcoal.com/manage/newsaction.do?method:webListPageNewsArchivesByTypeid" post_param = {'pageNum':'1',\ 'pageSize':'20',\ 'jsonStr':'{"typeid":"238"}'} return_data = requests.post(url,data =post_param) content=return_data.text content
到此這篇關(guān)于教你如何使用Python快速爬取需要的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Python爬取數(shù)據(jù)內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。