python網頁抓取
python自帶了urllib和urllib2模塊,以及第三方的requests庫來抓取網頁,這里我們使用easy_install包管理工具下載 requests庫,BeautifulSoup庫,在CMD命令行下,切換到easy_install的目錄,運行命令easy_install 包名稱。
easy_install requests
安裝好requests包之后,我們就可以選擇使用urllib,urllib2或requests庫來抓取網頁了
1.網頁內容的抓取
#! /usr/bin/env python#coding:utf-8 import urllib import urllib2 import requests import sys url = 'http://www.csdn.net' def urllib2Test(): req = urllib2.Request(url) response = urllib2.urlopen(req) thePage = response.read() def requestsTest(): r = requests.get(url) r.status_code r.content r.headers def urllib2TestEx(url): req = urllib2.Request(url) try: response = urllib2.urlopen(req) content = response.read() except urllib2.URLError,e: print e.reason def urlhttperror(url): req = urllib2.Request(url) try:urllib2.urlopen(req) except urllib2.HTTPError,e: print e.read() if __name__ == '__main__': urllib2Test() requestsTest() urllib2TestEx(url) urlhttperror(url) </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959552577110034519" target="_blank"></a></div>
</div> </div>
2.爬蟲偽裝成瀏覽器的訪問
在訪問一些網站時,會出現HTTPError: HTTP Error 403: Forbidden這樣的異常,這是由于現在有些網站禁止爬蟲訪問,爬蟲會帶來服務器上的負擔,爬蟲和瀏覽器發出的http請求區別在于:當用戶發送一個http請求的時候,瀏覽的的版本信息也包含在了http請求信息中,而爬蟲就不包含頭信息,當服務器端收到一個頁面訪問請求時,如果不知道發送這個請求使用的瀏覽器,操作系統,硬件平臺等信息,這些信息在HTTP協議的中的一個字段User-agent中,缺失這些信息,服務器會認為這些請求是非正常的訪問,我們用 Fiddler工具就可以看到瀏覽器的請求的信息.
對于禁止爬蟲的網站,可以偽裝成瀏覽器訪問,在請求中加入UserAgent的信息。添加和修改headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}req = urllib2.Request("http://blog.csdn.net/nevasun", headers=headers)
偽裝成瀏覽器訪問如下#! /usr/bin/env pythoncoding:utf-8
import requests
from BeautifulSoup import BeautifulSoup
from os.path import dirname, abspath
import sys
import osPREFIX = dirname(abspath(file))
這段代碼是用于解決中文報錯的問題
reload(sys)
sys.setdefaultencoding("utf8")#
defaultWaitTime = 1
def getHtmlContent(url):
global defaultWaitTime
content = None
retry = 0
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}
AccessFrequency = defaultWaitTime
while retry < 5:
try:
r = requests.get(url,timeout=10,headers=headers)
content = r.content
return content
except:
retry+=1
time.sleep(AccessFrequency)
return content
def Test():
content = getHtmlContent("print content
if name == 'main':
Test() </pre></div> </div> </div> 來自:http://blog.csdn.net/figo829/article/details/18155925本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關資訊
相關文檔
目錄