摘要:編碼我們發(fā)現(xiàn),中有時候存在中文,這是就需要對進(jìn)行編碼。可以先將中文轉(zhuǎn)換成編碼,然后使用方法對參數(shù)進(jìn)行編碼后傳遞。
本文檔對日常學(xué)習(xí)中用 python 做數(shù)據(jù)爬取時所遇到的一些問題做簡要記錄,以便日后查閱,部分問題可能因?yàn)檎J(rèn)識不到位會存在一些誤解,敬請告知,萬分感謝,共同進(jìn)步。
估算網(wǎng)站規(guī)模該小節(jié)主要針對于整站爬取的情況。
爬取整站之前,肯定是要先對一個網(wǎng)站的規(guī)模進(jìn)行估計。這是可以使用google搜索查看大概有多少個網(wǎng)址,這里使用到google搜索的一個小技巧。
site:url地址
有的時候可查看網(wǎng)站的sitemap.xml,但它有時候會過期或者滯后,不是很準(zhǔn)確。
識別網(wǎng)站所用技術(shù)要爬的網(wǎng)站使用的技術(shù)會影響到我們所寫的代碼中的處理手段。
推薦使用builtwith這個第三方包,可以使用pip來安裝。
簡單使用如下:
In [1]: import builtwith In [2]: builtwith.parse("http://example.webscraping.com/") Out[2]: {u"javascript-frameworks": [u"jQuery", u"Modernizr", u"jQuery UI"], u"programming-languages": [u"Python"], u"web-frameworks": [u"Web2py", u"Twitter Bootstrap"], u"web-servers": [u"Nginx"]}偽裝成瀏覽器
UA,即 User-Agent,是Http協(xié)議的一部分,屬于頭域的組成部分,發(fā)送 http 請求時,請求頭中會有 User-Agent字段。服務(wù)器通過該字段來分辨發(fā)送請求的瀏覽器類型、版本、內(nèi)核以及操作系統(tǒng)信息等。
在瀏覽器 console 可用如下命令來獲得該瀏覽器的 UA 標(biāo)識
navigator.userAgent
部分網(wǎng)站不想被爬蟲爬取就會檢查 http 請求頭的該字段內(nèi)容, 所以在用爬蟲做抓取時,通常要在請求頭加上該字段,以把自己偽裝成瀏覽器。有時候通過手機(jī)瀏覽器訪問得到的頁面會更加簡潔,更容易抓取,所以偽裝成手機(jī)瀏覽器也是一種好方法。
網(wǎng)上有很多整理的不同瀏覽器的 UA ,比如各種瀏覽器UserAgent一覽表。
瀏覽器野史 UserAgent列傳(上)和 瀏覽器野史 UserAgent列傳(下),這兩篇文章細(xì)說了 UA 的來龍去脈,去感受下當(dāng)時波瀾壯闊的“瀏覽器之戰(zhàn)”。
部分服務(wù)器會檢查 http 請求頭的 Referer 字段來判斷你是否是從指定頁面跳轉(zhuǎn)而來的,以達(dá)到防盜鏈的作用。因此在偽裝請求頭部的時候,該字段也是不容忽視的。
url 編碼我們發(fā)現(xiàn),URL 中有時候存在中文,這是就需要對 url 進(jìn)行編碼。
可以先將中文轉(zhuǎn)換成 utf-8 編碼,然后使用 urllib2.quote 方法對參數(shù)進(jìn)行 url 編碼后傳遞。
import urllib param = u"你好" param = param.encode("utf-8") param = urllib.quote(param)
對于 url 來說,之所以要進(jìn)行編碼,是因?yàn)?url 中有些字符會引起歧義。
同理使用 unquote 可以解碼。
經(jīng)常會遇到這樣情況:將網(wǎng)頁拖到底部會自動往下加載新的數(shù)據(jù),或者有加載更多這樣的按鈕,這里說的就是 AJAX 了。
AJAX 是 Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)的縮寫。它通過使用原有的 web 標(biāo)準(zhǔn)組件,實(shí)現(xiàn)了在不重新加載整個頁面的情況下,與服務(wù)器進(jìn)行數(shù)據(jù)交互。例如在新浪微博中,你可以展開一條微博的評論,而不需要重新加載,或者打開一個新的頁面。但是這些內(nèi)容并不是一開始就在頁面中的(這樣頁面就太大了),而是在你點(diǎn)擊的時候被加載進(jìn)來的。這就導(dǎo)致了你抓取這個頁面的時候,并不能獲得這些評論信息(因?yàn)槟銢]有『展開』)。通過審查元素找請求的 js 地址AJAX 一般是通過 XMLHttpRequest 對象接口發(fā)送請求的,XMLHttpRequest 一般被縮寫為 XHR。
這些 js 的名字通常看起來與其他的不太一樣。
拿澎湃網(wǎng)舉個栗子,這才是發(fā)送請求獲得文章的真正地址,
AJAX 的一種常見用法是使用 AJAX 加載 JSON 數(shù)據(jù),然后在瀏覽器端渲染。
這種情況很好處理,因?yàn)?python 自帶的處理 json 的庫,舉個栗子:
豌豆莢安卓游戲排行榜,每次點(diǎn)擊更多會加載新的數(shù)據(jù)。在審查元素里,可以看到每次點(diǎn)擊查看更多,都會返回一個包含應(yīng)用數(shù)據(jù)詳細(xì)信息的數(shù)據(jù)。
查看請求 json 數(shù)據(jù)的地址
http://apps.wandoujia.com/api...
max 參數(shù)的值表示這一次請求返回多少個 app 信息, start 參數(shù)的值表示從第幾個 app 開始,start 從 0 開始。
另外,在構(gòu)建請求頭時,應(yīng)該加上這個參數(shù) "X-Requested-With": "XMLHttpRequest",當(dāng)使用 XHR 發(fā)送 AJAX 請求時 Header 會帶上這個字段,常被用于判斷是不是 AJAX 請求。
Selenium+PhantomJSSelenium 是一個強(qiáng)大的網(wǎng)絡(luò)數(shù)據(jù)采集工具,最初是為網(wǎng)站自動測試而開發(fā)的。它可以讓瀏覽器自動加載頁面,獲取所需要的數(shù)據(jù),甚至頁面截屏,或者判斷網(wǎng)站上某些動作事都發(fā)生。
對應(yīng)的 python 庫,可以用 pip 安裝。
PhantomJS 是一個 headless browser,它會把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的 JavaScript,但是不會向用戶展示網(wǎng)頁的圖形界面。它不是python庫,需要多帶帶下載(喏,你要的官網(wǎng))。
寫一個簡單的栗子:
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.PhantomJS(executable_path="") driver.get("http://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") elem.clear() elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source driver.close()
Path to PhantomJs 處 需要指定位置,如果該路徑已經(jīng)加入到了環(huán)境變量中,那么可以不加這個參數(shù)。
這里只是個簡單的介紹,后續(xù)會對 Selenium 的 python 版 API 的使用做多帶帶介紹。
部分網(wǎng)站對 ip 進(jìn)行了限制,導(dǎo)致我們無法爬到想要的數(shù)據(jù),這個時候可以用代理來做。
使用 requests 這個第三方庫,可以輕松地設(shè)置代理。
再舉個栗子:
import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://example.org", proxies=proxies)發(fā)送 http 請求
雖然自帶的 urllib 和 urllib2 庫可以滿足需求,但是不推薦使用。為什么?因?yàn)樗鼈兊牟僮魈爆崳绕湓谔幚硪恍?fù)雜情況時,這不符合 python 的設(shè)計哲學(xué),所以放手拋棄它們吧。
推薦使用 requests這個第三方庫,正如它標(biāo)榜的那樣--Requests: HTTP for Humans,同時也支持 py3。
使用 requests 庫發(fā)送請求是如此的優(yōu)雅,
import requests r = requests.get("https://api.github.com/events") print r.text
具體使用方法可以看官方 API。
解析頁面既然獲取到了請求頁面的源碼,那么接下來要做的就是解析工作,一般來說,有下面三個庫用得是最多的:lxml庫, bs4庫,以及正則。
lxml 解析速度要比 bs4 快,據(jù)說快好幾倍,正則是個終結(jié)技,只是寫起來有點(diǎn)麻煩。另外, bs4 不支持 xpath,而lxml 支持,總之,視自己的情況選擇了。
前幾天還接觸過一個庫,名字叫 pyquery,它是 jQuery 的 python 實(shí)現(xiàn),可以用于解析 html 網(wǎng)頁內(nèi)容,熟悉 jQuery 語法童鞋的福音。
前幾天遇到一個問題,問題是這樣的,html 頁面的數(shù)據(jù)經(jīng)過Beautiful Soup庫的解析后,部分html源碼丟失,找不到想要的數(shù)據(jù)了,問題代碼如下:
#! /usr/bin/env python # -*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup url = "http://product.pconline.com.cn/mobile/" res = requests.get(url) html = res.text # print html soup = BeautifulSoup(html, "lxml") site = soup.findAll("img", class_="pic") print site
輸出結(jié)果為空,沒有想要的數(shù)據(jù)。查看官方文檔,bs 庫支持的解析庫有 lxml, html5lib 和 html.parser。用的最多的是 lxml,因?yàn)樗慕馕鏊俣瓤欤⑶胰蒎e能力強(qiáng),默認(rèn)也是使用該解析器。
出現(xiàn)解析后源碼丟失的可能原因有 2 個:
BeautifulSoup 有時候會遇到非法的,不支持的 html 源碼而導(dǎo)致無法解析或無法正常解析 html;
處理的文檔太大,而處理的解析器緩存不夠造成的信息丟失。
這里換一個解析器,換成 html.parser 就可以了。
編碼問題將編碼設(shè)置為 utf-8
import sys reload(sys) sys.setdefaultencoding("utf-8")
總之,py2 中的編碼問題很煩人,只要解碼與編碼不一致就會出現(xiàn)亂碼。對 unicode 可以 編碼,其他編碼 decode 成 unicode。
要注意"hello" 和 u"hello" 的區(qū)別。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41740.html
摘要:都說年末了,該給自己寫寫總結(jié)了。我現(xiàn)在做一些簡單的爬蟲都會用它。并且對數(shù)據(jù)的實(shí)時性要求較高,或者爬數(shù)據(jù)的時候封的太厲害了。對于這一類的爬蟲。消息隊(duì)列用于分發(fā)消息給某個爬蟲節(jié)點(diǎn)。爬蟲節(jié)點(diǎn)完成具體的爬蟲,格式化爬蟲數(shù)據(jù)。最后,感謝我的,謝謝 都說年末了,該給自己寫寫總結(jié)了。今天我想談一談的是我在公司這一年多里的負(fù)責(zé)的部分工作---爬蟲。做了這么久的爬蟲,是該寫點(diǎn)什么,留下點(diǎn)什么。在我所負(fù)責(zé)...
摘要:簡介爬蟲這個東西我就不多做介紹了,總之是一個很好用的爬蟲庫,且關(guān)于也有較多的教程。這篇文章記錄一下我個人的項(xiàng)目規(guī)劃和天坑心得。然后執(zhí)行就會自動去爬數(shù)據(jù)了。常用配置這里要結(jié)合一些原因來進(jìn)行說明。 簡介 scrapy爬蟲這個東西我就不多做介紹了,總之是一個很好用的Python爬蟲庫,且關(guān)于scrapy也有較多的教程。這篇文章記錄一下我個人的項(xiàng)目規(guī)劃和天坑心得。 通常來說,我們執(zhí)行了scra...
摘要:做這一領(lǐng)域的工作,有很多網(wǎng)站能夠起到輔助性的作用。再加上爬蟲相對于其他熱門方向來說,更容易學(xué)。也促使更多人會優(yōu)先選擇學(xué)習(xí)爬蟲。能夠代替手工完成手工無法完成的測試任務(wù),并且可以記錄相關(guān)數(shù)據(jù)及報告。 ...
摘要:也就是說,我的篇文章的請求對應(yīng)個實(shí)例,這些實(shí)例都請求完畢后,執(zhí)行以下邏輯他的目的在于對每一個返回值這個返回值為單篇文章的內(nèi)容,進(jìn)行方法處理。 英國人Robert Pitt曾在Github上公布了他的爬蟲腳本,導(dǎo)致任何人都可以容易地取得Google Plus的大量公開用戶的ID信息。至今大概有2億2千5百萬用戶ID遭曝光。 亮點(diǎn)在于,這是個nodejs腳本,非常短,包括注釋只有71行。 ...
摘要:時間永遠(yuǎn)都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:我是一個知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數(shù)據(jù),我感覺這個過程還是挺有意思,因?yàn)檫@是一個不斷給自己創(chuàng)造問題又去解決問題的過程。所以這只爬蟲還有登陸知乎搜索題目的功能。 我一直覺得,爬蟲是許多web開發(fā)人員難以回避的點(diǎn)。我們也應(yīng)該或多或少的去接觸這方面,因?yàn)榭梢詮呐老x中學(xué)習(xí)到web開發(fā)中應(yīng)當(dāng)掌握的一些基本知識。而且,它還很有趣。 我是一個知乎輕微重度用戶,之前寫了一只爬...
閱讀 1480·2021-11-17 09:33
閱讀 1260·2021-10-11 10:59
閱讀 2892·2021-09-30 09:48
閱讀 1904·2021-09-30 09:47
閱讀 3023·2019-08-30 15:55
閱讀 2335·2019-08-30 15:54
閱讀 1492·2019-08-29 15:25
閱讀 1645·2019-08-29 10:57