python網頁抓取

jopen 10年前發布 | 35K 次閱讀 Python開發 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 python

coding:utf-8

import requests
from BeautifulSoup import BeautifulSoup
from os.path import dirname, abspath
import sys
import os

PREFIX = 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!