摘要:編碼我們發現,中有時候存在中文,這是就需要對進行編碼。可以先將中文轉換成編碼,然后使用方法對參數進行編碼后傳遞。
本文檔對日常學習中用 python 做數據爬取時所遇到的一些問題做簡要記錄,以便日后查閱,部分問題可能因為認識不到位會存在一些誤解,敬請告知,萬分感謝,共同進步。
估算網站規模該小節主要針對于整站爬取的情況。
爬取整站之前,肯定是要先對一個網站的規模進行估計。這是可以使用google搜索查看大概有多少個網址,這里使用到google搜索的一個小技巧。
site:url地址
有的時候可查看網站的sitemap.xml,但它有時候會過期或者滯后,不是很準確。
識別網站所用技術要爬的網站使用的技術會影響到我們所寫的代碼中的處理手段。
推薦使用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協議的一部分,屬于頭域的組成部分,發送 http 請求時,請求頭中會有 User-Agent字段。服務器通過該字段來分辨發送請求的瀏覽器類型、版本、內核以及操作系統信息等。
在瀏覽器 console 可用如下命令來獲得該瀏覽器的 UA 標識
navigator.userAgent
部分網站不想被爬蟲爬取就會檢查 http 請求頭的該字段內容, 所以在用爬蟲做抓取時,通常要在請求頭加上該字段,以把自己偽裝成瀏覽器。有時候通過手機瀏覽器訪問得到的頁面會更加簡潔,更容易抓取,所以偽裝成手機瀏覽器也是一種好方法。
網上有很多整理的不同瀏覽器的 UA ,比如各種瀏覽器UserAgent一覽表。
瀏覽器野史 UserAgent列傳(上)和 瀏覽器野史 UserAgent列傳(下),這兩篇文章細說了 UA 的來龍去脈,去感受下當時波瀾壯闊的“瀏覽器之戰”。
部分服務器會檢查 http 請求頭的 Referer 字段來判斷你是否是從指定頁面跳轉而來的,以達到防盜鏈的作用。因此在偽裝請求頭部的時候,該字段也是不容忽視的。
url 編碼我們發現,URL 中有時候存在中文,這是就需要對 url 進行編碼。
可以先將中文轉換成 utf-8 編碼,然后使用 urllib2.quote 方法對參數進行 url 編碼后傳遞。
import urllib param = u"你好" param = param.encode("utf-8") param = urllib.quote(param)
對于 url 來說,之所以要進行編碼,是因為 url 中有些字符會引起歧義。
同理使用 unquote 可以解碼。
經常會遇到這樣情況:將網頁拖到底部會自動往下加載新的數據,或者有加載更多這樣的按鈕,這里說的就是 AJAX 了。
AJAX 是 Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)的縮寫。它通過使用原有的 web 標準組件,實現了在不重新加載整個頁面的情況下,與服務器進行數據交互。例如在新浪微博中,你可以展開一條微博的評論,而不需要重新加載,或者打開一個新的頁面。但是這些內容并不是一開始就在頁面中的(這樣頁面就太大了),而是在你點擊的時候被加載進來的。這就導致了你抓取這個頁面的時候,并不能獲得這些評論信息(因為你沒有『展開』)。通過審查元素找請求的 js 地址AJAX 一般是通過 XMLHttpRequest 對象接口發送請求的,XMLHttpRequest 一般被縮寫為 XHR。
這些 js 的名字通常看起來與其他的不太一樣。
拿澎湃網舉個栗子,這才是發送請求獲得文章的真正地址,
AJAX 的一種常見用法是使用 AJAX 加載 JSON 數據,然后在瀏覽器端渲染。
這種情況很好處理,因為 python 自帶的處理 json 的庫,舉個栗子:
豌豆莢安卓游戲排行榜,每次點擊更多會加載新的數據。在審查元素里,可以看到每次點擊查看更多,都會返回一個包含應用數據詳細信息的數據。
查看請求 json 數據的地址
http://apps.wandoujia.com/api...
max 參數的值表示這一次請求返回多少個 app 信息, start 參數的值表示從第幾個 app 開始,start 從 0 開始。
另外,在構建請求頭時,應該加上這個參數 "X-Requested-With": "XMLHttpRequest",當使用 XHR 發送 AJAX 請求時 Header 會帶上這個字段,常被用于判斷是不是 AJAX 請求。
Selenium+PhantomJSSelenium 是一個強大的網絡數據采集工具,最初是為網站自動測試而開發的。它可以讓瀏覽器自動加載頁面,獲取所需要的數據,甚至頁面截屏,或者判斷網站上某些動作事都發生。
對應的 python 庫,可以用 pip 安裝。
PhantomJS 是一個 headless browser,它會把網站加載到內存并執行頁面上的 JavaScript,但是不會向用戶展示網頁的圖形界面。它不是python庫,需要多帶帶下載(喏,你要的官網)。
寫一個簡單的栗子:
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 處 需要指定位置,如果該路徑已經加入到了環境變量中,那么可以不加這個參數。
這里只是個簡單的介紹,后續會對 Selenium 的 python 版 API 的使用做多帶帶介紹。
部分網站對 ip 進行了限制,導致我們無法爬到想要的數據,這個時候可以用代理來做。
使用 requests 這個第三方庫,可以輕松地設置代理。
再舉個栗子:
import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://example.org", proxies=proxies)發送 http 請求
雖然自帶的 urllib 和 urllib2 庫可以滿足需求,但是不推薦使用。為什么?因為它們的操作太繁瑣,尤其在處理一些復雜情況時,這不符合 python 的設計哲學,所以放手拋棄它們吧。
推薦使用 requests這個第三方庫,正如它標榜的那樣--Requests: HTTP for Humans,同時也支持 py3。
使用 requests 庫發送請求是如此的優雅,
import requests r = requests.get("https://api.github.com/events") print r.text
具體使用方法可以看官方 API。
解析頁面既然獲取到了請求頁面的源碼,那么接下來要做的就是解析工作,一般來說,有下面三個庫用得是最多的:lxml庫, bs4庫,以及正則。
lxml 解析速度要比 bs4 快,據說快好幾倍,正則是個終結技,只是寫起來有點麻煩。另外, bs4 不支持 xpath,而lxml 支持,總之,視自己的情況選擇了。
前幾天還接觸過一個庫,名字叫 pyquery,它是 jQuery 的 python 實現,可以用于解析 html 網頁內容,熟悉 jQuery 語法童鞋的福音。
前幾天遇到一個問題,問題是這樣的,html 頁面的數據經過Beautiful Soup庫的解析后,部分html源碼丟失,找不到想要的數據了,問題代碼如下:
#! /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
輸出結果為空,沒有想要的數據。查看官方文檔,bs 庫支持的解析庫有 lxml, html5lib 和 html.parser。用的最多的是 lxml,因為它的解析速度快,并且容錯能力強,默認也是使用該解析器。
出現解析后源碼丟失的可能原因有 2 個:
BeautifulSoup 有時候會遇到非法的,不支持的 html 源碼而導致無法解析或無法正常解析 html;
處理的文檔太大,而處理的解析器緩存不夠造成的信息丟失。
這里換一個解析器,換成 html.parser 就可以了。
編碼問題將編碼設置為 utf-8
import sys reload(sys) sys.setdefaultencoding("utf-8")
總之,py2 中的編碼問題很煩人,只要解碼與編碼不一致就會出現亂碼。對 unicode 可以 編碼,其他編碼 decode 成 unicode。
要注意"hello" 和 u"hello" 的區別。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41740.html
摘要:都說年末了,該給自己寫寫總結了。我現在做一些簡單的爬蟲都會用它。并且對數據的實時性要求較高,或者爬數據的時候封的太厲害了。對于這一類的爬蟲。消息隊列用于分發消息給某個爬蟲節點。爬蟲節點完成具體的爬蟲,格式化爬蟲數據。最后,感謝我的,謝謝 都說年末了,該給自己寫寫總結了。今天我想談一談的是我在公司這一年多里的負責的部分工作---爬蟲。做了這么久的爬蟲,是該寫點什么,留下點什么。在我所負責...
摘要:簡介爬蟲這個東西我就不多做介紹了,總之是一個很好用的爬蟲庫,且關于也有較多的教程。這篇文章記錄一下我個人的項目規劃和天坑心得。然后執行就會自動去爬數據了。常用配置這里要結合一些原因來進行說明。 簡介 scrapy爬蟲這個東西我就不多做介紹了,總之是一個很好用的Python爬蟲庫,且關于scrapy也有較多的教程。這篇文章記錄一下我個人的項目規劃和天坑心得。 通常來說,我們執行了scra...
摘要:做這一領域的工作,有很多網站能夠起到輔助性的作用。再加上爬蟲相對于其他熱門方向來說,更容易學。也促使更多人會優先選擇學習爬蟲。能夠代替手工完成手工無法完成的測試任務,并且可以記錄相關數據及報告。 ...
摘要:也就是說,我的篇文章的請求對應個實例,這些實例都請求完畢后,執行以下邏輯他的目的在于對每一個返回值這個返回值為單篇文章的內容,進行方法處理。 英國人Robert Pitt曾在Github上公布了他的爬蟲腳本,導致任何人都可以容易地取得Google Plus的大量公開用戶的ID信息。至今大概有2億2千5百萬用戶ID遭曝光。 亮點在于,這是個nodejs腳本,非常短,包括注釋只有71行。 ...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:我是一個知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數據,我感覺這個過程還是挺有意思,因為這是一個不斷給自己創造問題又去解決問題的過程。所以這只爬蟲還有登陸知乎搜索題目的功能。 我一直覺得,爬蟲是許多web開發人員難以回避的點。我們也應該或多或少的去接觸這方面,因為可以從爬蟲中學習到web開發中應當掌握的一些基本知識。而且,它還很有趣。 我是一個知乎輕微重度用戶,之前寫了一只爬...
閱讀 1500·2021-11-17 09:33
閱讀 1267·2021-10-11 10:59
閱讀 2900·2021-09-30 09:48
閱讀 1909·2021-09-30 09:47
閱讀 3032·2019-08-30 15:55
閱讀 2342·2019-08-30 15:54
閱讀 1499·2019-08-29 15:25
閱讀 1653·2019-08-29 10:57