1. 程式人生 > >Python爬蟲開發與專案實戰 3: 初識爬蟲

Python爬蟲開發與專案實戰 3: 初識爬蟲

3.1 網路爬蟲概述

     概念:按照系統結構和實現技術,大致可分:通用網路爬蟲、聚焦爬蟲、增量式爬蟲、深層爬蟲。實際的爬蟲系統通常是幾種技術的相結合實現的。

           搜尋引擎:屬於通用爬蟲,但存在一定的侷限性:

                        檢索結果包含大量使用者不關心的網頁

                        有限的伺服器資源與無限的網路資料資源之間的矛盾

                        SEO往往對資訊含量密集且具有一定結構的資料無能為力,如音視訊等

                        基於關鍵字的檢索,難以支援根據語義資訊提出的查詢

            為了解決上述問題,定向抓取相關網頁資源的聚焦爬蟲應運而生

            聚焦爬蟲:一個自動下載網頁的程式,為面向主題的使用者查詢準備資料資源

            增量式爬蟲:採取更新和只爬新產生的網頁。減少時間和空間上的耗費,但增加演算法複雜度和實現難度

            深層爬蟲:網頁分表層網頁(SEO可以索引的)和深層網頁(表單後的)

     場景:BT搜尋網站(https://www.cilisou.org/),雲盤搜尋網站(http://www.pansou.com/)

     基本工作流程如下:

  1. 首先選取一部分精心挑選的種子URL
  2. 將這些URL放入待抓取URL佇列
  3. 從待抓取URL佇列中讀取URL,解析DNS,得到IP,下載網頁,儲存網頁,將URL放進已抓取URL佇列
  4. 分析已抓取URL佇列中的URL,分析網頁中的URL,比較去重,後放入待抓取URL佇列,進入下一個迴圈。

3.2 HTTP請求的Python實現

     Python中實現HTTP請求的三種方式:urllib2/urllib  httplib/urllib   Requests

     urllib2/urllib實現:Python中的兩個內建模組,以urllib2為主,urllib為輔

     1.實現一個完整的請求與響應模型

import urllib2
response = urllib2.urlopen('http://www.zhihu.com')
html = response.read()
print html
      將請求響應分為兩步:一步是請求,一步是響應
import urllib2
request = urllib2.Request('http://www.zhihu.com')
response = urllib2.urlopen(request)
html = response.read()
print html
       POST方式:

              有時伺服器拒絕你的訪問,因為伺服器會檢驗請求頭。常用的反爬蟲的手段。

      2、實現請求頭headers處理

import urllib
import urllib2
url = 'http://www.xxxx.com/login'
user_agent = ''
referer = 'http://www.xxxx.com/'
postdata = {'username': 'qiye',
             'password': 'qiye_pass' }
# 寫入頭資訊
headers = {'User-Agent': user_agent, 'Referer': referer}
data = urllib.urlencode(postdata)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
html = response.read()
     3、Cookie處理:使用CookieJar函式進行Cookie的管理
import urllib2
import cookielib
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open('http://www.zhihu.com')
for item in cookie:
	print item.name + ':' + item.value
SessionID_R3:4y3gT2mcOjBQEQ7RDiqDz6DfdauvG8C5j6jxFg8jIcJvE5ih4USzM0h8WRt1PZomR1C9755SGG5YIzDJZj7XVraQyomhEFA0v6pvBzV94V88uQqUyeDnsMj8MALBSKr
        4、Timeout設定超時
import urllib2
request = urllib2.Request('http://www.zhihu.com')
response = urllib2.urlopen(request, timeout=2)
html = response.read()
print html
         5、獲取HTTP響應碼
import urllib2
try:
	response = urllib2.urlopen('http://www.google.com')
	print response
except urllib2.HTTPError as e:
	if hasattr(e, 'code'):
		print 'Error code:', e.code
          6、重定向:urllib2預設情況下會針對HTTP 3XX返回碼自動進行重定向

         只要檢查Response的URL和Request的URL是否相同

import urllib2
response = urllib2.urlopen('http://www.zhihu.com')
isRedirected = response.geturl() == 'http://www.zhihu.com'
          7、Proxy的設定:urllib2預設會使用環境變數http_proxy來設定HTTP Proxy,但我們一般不採用這種方式,而用ProxyHandler在程式中動態設定代理。
import urllib2
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy, )
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.zhihu.com/')
print response.read()
     install_opener()會設定全域性opener,但如想使用兩個不同的Proxy代理,比較好的做法是直接呼叫的open方法代替全域性urlopen方法
import urllib2
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy, )
response = opener.open('http://www.zhihu.com/')
print response.read()
       httplib/urllib實現:一個底層基礎模組,可以看到建立HTTP請求的每一步,但是實現的功能比較少。

       Requests:更人性化,是第三方模組,pip install requests

import requests
r = requests.get('http://www.baidu.com')
print r.content
        2、響應與編碼
import requests
r = requests.get('http://www.baidu.com')
print 'content-->' + r.content
print 'text-->' + r.text
print 'encoding-->' + r.encoding
r.encoding = 'utf-8'
print 'new text-->' + r.text
     pip install chardet  一個非常優秀的字串/檔案編碼檢查模組

     直接將chardet探測到的編碼,賦給r.encoding實現解碼,r.text輸出就不會有亂碼了。

import requests
import chardet
r = requests.get('http://www.baidu.com')
print chardet.detect(r.content)
r.encoding = chardet.detect(r.content)['encoding']
print r.text
      流模式
import requests
r = requests.get('http://www.baidu.com', stream=True)
print r.raw.read(10)
         3、請求頭headers處理
import requests
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
headers = {'User-Agent': user_agent}
r = requests.get('http://www.baidu.com', headers=headers)
print r.content
        4、響應碼code和響應頭headers處理
# -*- coding: utf-8 -*-
import requests
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
headers = {'User-Agent': user_agent}
r = requests.get('http://www.baidu.com', headers=headers)
if r.status_code == requests.codes.ok:
	print r.status_code    #響應碼
	print r.headers        #響應頭
	print r.headers.get('content-type')  # 推薦這種方式
	print r.headers['content-type']      # 不推薦這種方式
else:
	r.raise_for_status()
          5、Cookie處理
# -*- coding: utf-8 -*-
import requests
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
headers = {'User-Agent': user_agent}
r = requests.get('http://www.baidu.com', headers=headers)
# 遍歷出所有的cookie欄位的值
for cookie in r.cookies.keys():
	print cookie + ":" + r.cookies.get(cookie)
         將自定義的Cookie值傳送出去
# -*- coding: utf-8 -*-
import requests
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
headers = {'User-Agent': user_agent}
cookies = dict(name='qiye', age='10')
r = requests.get('http://www.baidu.com', headers=headers, cookies=cookies)
print r.text
          Requests提供了session的概念,使我們不需要關心Cookie值,可連續訪問網頁
# -*- coding: utf-8 -*-
import requests
loginUrl = "http://www.xxx.com/login"
s = requests.Session()
# 首次訪問,作為遊客,伺服器分配一個cookie
r = s.get(loginUrl, allow_redirects=True)
datas = {'name':'qiye', 'passwd': 'qiye'}
# 向登入連結傳送post請求,遊客許可權轉為會員許可權
r = s.post(loginUrl, data=datas.allow_redirects=Trues)
print r.text
     這是一個正式遇到的問題,如果沒有第一不訪問登入的頁面,而是直接向登入連結傳送Post請求,系統會把你當做非法使用者,因為訪問登入介面式會分配一個Cookie,需要將這個Cookie在傳送Post請求時帶上,這種使用Session函式處理Cookie的方式之後會很常用。

            6、重定向與歷史資訊

            只需設定以下allow_redicts欄位即可,可通過r.history欄位檢視歷史資訊

# -*- coding: utf-8 -*-
import requests
r= requests.get('http://github.com')   # 重定向為https://github.com
print r.url
print r.status_code
print r.history
           7、超時設定

                requests.get('http://github.com', timeout=2)

            8、代理設定

# -*- coding: utf-8 -*-
import requests
proxies = {
	"http" = "http://0.10.10.01:3234",
	"https" = "http://0.0.0.2:1020",
}
r= requests.get('http://github.com', proxies=proxies)
         也可通過環境變數HTTP_PROXY和HTTPS_PROXY來配置,但不常用。

         你的代理需要使用HTTP Basic Auth,可以用http://user:password&host/語法       

相關推薦

Python爬蟲開發專案實戰 3: 初識爬蟲

3.1 網路爬蟲概述      概念:按照系統結構和實現技術,大致可分:通用網路爬蟲、聚焦爬蟲、增量式爬蟲、深層爬蟲。實際的爬蟲系統通常是幾種技術的相結合實現的。            搜尋引擎:屬於通用爬蟲,但存在一定的侷限性:                      

Python工業網際網路監控專案實戰3—websocket to UI

  本小節繼續演示如何在Django專案中採用早期websocket技術原型來實現把OPC服務端資料實時推送到UI端,讓監控頁面在另一種技術方式下,實時顯示現場裝置的工藝資料變化情況。本例我們仍然採用比較輕量級的dwebsocket元件。 1. 安裝dwebsocket元件    安裝命令

分享《精通Python網路爬蟲:核心技術、框架專案實戰》中文PDF+原始碼

下載:https://pan.baidu.com/s/1DqeZDF-MOAQ6hlNx2fq3JA 《精通Python網路爬蟲:核心技術、框架與專案實戰》中文PDF+原始碼PDF,306頁,帶書籤目錄。配套原始碼。 系統介紹Python網路爬蟲,注重實戰,涵蓋網路爬蟲原理、如何手寫Python網路爬蟲、

Python爬蟲專案實戰3 | 圖片文字識別(以驗證碼識別為例)

1.專案背景 我在實習過程中,當我抓取環保平臺相關資料時,常常發現有圖片的情況,比如以下這種圖片,所以抓取這種圖片中的資訊是我進行圖片文字識別的動力: 2.專案思路 因為在某一網站中有大量這種想要抓取的圖片,所以我的思路是, 1.先抓取這些圖片的名稱和URL; 2.然後再根

推薦《精通Python網路爬蟲 核心技術、框架專案實戰》附下載連結

韋瑋主編的《精通Python網路爬蟲(核心技術框架與專案實戰)》從技術、工具與實戰3個維度講解了Python網路爬蟲:     技術維度:詳細講解了Pvthon網路爬蟲實現的核心技術,包括網路爬蟲的工作原理、如何用urllib庫編寫網路爬蟲、爬蟲的異常處理、正則表示式、爬蟲中

小冊上新:Taro 多端開發實現原理專案實戰

學習一門技術的最好方法,就是在實踐中使用它。 Taro 也是如此。Taro 是由京東凹凸實驗室打造的一套遵循 React 語法規範的多端統一開發框架。他們為此專門撰寫了一本小冊子,主要介紹從 0 到 1 構建一個電商平臺的實戰過程。 我們通過一個從前端到後臺的完整實踐,可以經歷 React 語法的學習

微信小程式入門實戰 常用元件 API 開發技巧 專案實戰

      開始就以專案為出發點,不會講一大堆枯燥的語法再補充兩個案例了事,將帶你快速熟悉小程式基礎知識,然後直接進入實戰開發環節,將小程式的知識點貫穿在整個專案中        課程不僅僅講解小程式開發,更會通過實際的編碼來

Android NDK開發之旅(6):JNI函式完全解析專案實戰

對於基本型別而言,JNI與Java之間的對映是一對一的,比如Java中的int型別直接對應於C/C++中的jint;而對引用型別的處理卻是不同的,JNI把Java中的物件當作一個C指標傳遞到本地函式中,這個指標指向JVM中的內部資料結構,而內部資料結構在記憶體

Taro 多端開發實現原理專案實戰

學習一門技術的最好方法,就是在實踐中使用它。 Taro 也是如此。Taro 是由京東凹凸實驗室打

敏捷開發專案管理實戰之敏捷需求分析

敏捷開發中,全體成員都會參與需求分析。但是,通常多數的開發人員和測試人員他們的能力和經驗不足以勝任需求分析工作。這意味著全體成員參與的需求分析活動需要一個扮演導師角色的人帶領大家去進行有效的需求分析。本文以作者黃文海帶領

Python資料分析挖掘實戰程式碼糾錯 程式碼3-1

我是通過這本書來開始學習資料探勘和分析,在目前學的內容中,發現了書上的程式碼有些地方是錯誤了,在此希望分享下我除錯好的程式碼,供大家參考,相互學習。 1、程式碼清單3-1 餐飲銷額資料異常值檢測程式碼 書上的程式碼如下: #-*- coding: utf-

Python核心程式設計》之資料庫程式設計快速入門專案實戰

資料庫儲存是一種持久化儲存,因此先從持久化儲存說起吧。 1.持久化儲存 (1).在任何應用中,都需要持久化儲存。一般有3種基礎的儲存機制:檔案、資料庫系統和一些混合型別。這種混合型別包括現有現有系統上的API、ORM、檔案管理器、電子表格、配置檔案等。 (2).檔案或簡單的持久化儲存可以滿足

Django 2.0 專案實戰 (3): 使用者重置密碼退出登入

在之前兩篇文章中我們擴充套件了Django自帶的User模型並實現了使用者的登入與註冊,並同時實現了檢視和編輯使用者個人資料的功能。本文是Django實現使用者註冊登入系列教程的最後一篇,我們將會開發兩

Python之Django商城專案實戰(一):搭建開發環境

一、搭建環境:1、安裝pythonsudo apt-get install python3-pip2、安裝mysql3、建立虛擬環境安裝虛擬環境:pip install virtualenv方法一:建立虛擬環境(python3.6):python -m venv myenv

微信小程式入門實戰 常用元件API開發技巧專案實戰

第1章 什麼是微信小程式?介紹小程式的特點與適用場景、對開發者的影響以及課程特色第2章 小程式環境搭建與開發工具介紹小程式開發工具的下載與安裝、微信Web開發者工具主要功能簡介第3章 從一個簡單的“歡迎“頁面開始小程式之旅完成第一個小程式頁面,並學習小程式的基本目錄與檔案結構

python資料分析挖掘實戰》筆記-3.1程式碼問題

問題 今天看到《python資料分析與挖掘實戰》這本書的第三章的第一份程式碼,照著書上的程式碼敲了一遍,發現在異常值處理的部分會報錯。 x = p['fliers'][0].get_xdata() y = p['fliers'][0].get_ydata()

React.js入門基礎專案實戰開發視訊教程

第1章 課程簡介課程導讀,介紹了課程的基本結構、課程的特點、最終實戰專案演示、前置知識點以及原始碼打包結構和後期相關學習資料的更新方式。第2章 React 簡介對 React 進行了詳細地簡介並對課程的前置知識點進行了詳細地梳理。第3章 React 初體驗介紹了此課程中使用的

菜鷄日記——《Python資料分析挖掘實戰》實驗6-1 拉格朗日插值法

實驗6-1 用拉格朗日插值法 題目描述:用拉格朗日插值法對missing_data.xls中表格的空值進行填補。 # p1, lab6 # Fill all of the null values with Lagrange's interpolation # Data file name i

【slighttpd】基於lighttpd架構的Server專案實戰(3)—Master&Worker模式

轉載地址:https://blog.csdn.net/jiange_zh/article/details/50636180 現在,我們開始一步步構建我們的專案了~ Master-Worker模式 本次一共涉及2個類:Master和Worker; 以下是兩者的標頭檔案: /****

Python資料分析挖掘實戰 pdf下載

Python資料分析與挖掘實戰是10餘位資料探勘領域資深專家和科研人員,10餘年大資料探勘諮詢與實施經驗結晶。從資料探勘的應用出發,以電力、航空、醫療、網際網路、生產製造以及公共服務等行業真實案例為主線,深入淺出介紹Python資料探勘建模過程,實踐性極強。 本書共15章,分兩個部分:基礎