1. 程式人生 > >[Python]網路爬蟲(二):利用urllib通過指定的URL抓取網頁內容

[Python]網路爬蟲(二):利用urllib通過指定的URL抓取網頁內容

1.基本方法

urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

-         url:  需要開啟的網址

-         data:Post提交的資料

-         timeout:設定網站的訪問超時時間

直接用urllib.request模組的urlopen()獲取頁面,page的資料格式為bytes型別,需要decode()解碼,轉換成str型別。

1 from urllib import
request 2 response = request.urlopen(r'http://python.org/') # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse型別 3 page = response.read() 4 page = page.decode('utf-8')

urlopen返回物件提供方法:

-         read() , readline() ,readlines() , fileno() , close() :對HTTPResponse型別資料進行操作

-         info():返回HTTPMessage物件,表示遠端伺服器返回的頭資訊

-         getcode():返回Http狀態碼。如果是http請求,200請求成功完成;404網址未找到

-         geturl():返回請求的url

2.使用Request

urllib.request.Request(url, data=None, headers={}, method=None)

使用request()來包裝請求,再通過urlopen()獲取頁面。

複製程式碼
 1 url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'
 2 headers = {
 3     'User-Agent': r'
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 4 r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3', 5 'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label', 6 'Connection': 'keep-alive' 7 } 8 req = request.Request(url, headers=headers) 9 page = request.urlopen(req).read() 10 page = page.decode('utf-8')
複製程式碼

用來包裝頭部的資料:

-         User-Agent :這個頭部可以攜帶如下幾條資訊:瀏覽器名和版本號、作業系統名和版本號、預設語言

-         Referer:可以用來防止盜鏈,有一些網站圖片顯示來源http://***.com,就是檢查Referer來鑑定的

-         Connection:表示連線狀態,記錄Session的狀態。

3.Post資料

urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

urlopen()的data引數預設為None,當data引數不為空的時候,urlopen()提交方式為Post。

複製程式碼
 1 from urllib import request, parse
 2 url = r'http://www.lagou.com/jobs/positionAjax.json?'
 3 headers = {
 4     'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
 5                   r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
 6     'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
 7     'Connection': 'keep-alive'
 8 }
 9 data = {
10     'first': 'true',
11     'pn': 1,
12     'kd': 'Python'
13 }
14 data = parse.urlencode(data).encode('utf-8')
15 req = request.Request(url, headers=headers, data=data)
16 page = request.urlopen(req).read()
17 page = page.decode('utf-8')
複製程式碼

urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

urlencode()主要作用就是將url附上要提交的資料。 

複製程式碼
1 data = {
2     'first': 'true',
3     'pn': 1,
4     'kd': 'Python'
5 }
6 data = parse.urlencode(data).encode('utf-8')
複製程式碼

經過urlencode()轉換後的data資料為?first=true?pn=1?kd=Python,最後提交的url為

http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python

Post的資料必須是bytes或者iterable of bytes,不能是str,因此需要進行encode()編碼

1 page = request.urlopen(req, data=data).read()

當然,也可以把data的資料封裝在urlopen()引數中

4.異常處理

複製程式碼
 1 def get_page(url):
 2     headers = {
 3         'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
 4                     r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
 5         'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
 6         'Connection': 'keep-alive'
 7     }
 8     data = {
 9         'first': 'true',
10         'pn': 1,
11         'kd': 'Python'
12     }
13     data = parse.urlencode(data).encode('utf-8')
14     req = request.Request(url, headers=headers)
15     try:
16         page = request.urlopen(req, data=data).read()
17         page = page.decode('utf-8')
18     except error.HTTPError as e:
19         print(e.code())
20         print(e.read().decode('utf-8'))
21     return page
複製程式碼

5、使用代理 

urllib.request.ProxyHandler(proxies=None)

當需要抓取的網站設定了訪問限制,這時就需要用到代理來抓取資料。

複製程式碼
 1 data = {
 2         'first': 'true',
 3         'pn': 1,
 4         'kd': 'Python'
 5     }
 6 proxy = request.ProxyHandler({'http': '5.22.195.215:80'})  # 設定proxy
 7 opener = request.build_opener(proxy)  # 掛載opener
 8 request.install_opener(opener)  # 安裝opener
 9 data = parse.urlencode(data).encode('utf-8')
10 page = opener.open(url, data).read()
11 page = page.decode('utf-8')
12 return page
複製程式碼

相關推薦

[Python]網路爬蟲利用urllib通過指定URL網頁內容

1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=F

[Python]網路爬蟲利用urllib2通過指定URL網頁內容

版本號:Python2.7.5,Python3改動較大,各位另尋教程。 所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。  類似於使用程式模擬IE瀏覽器的功能,把URL作為HTTP請求的內容傳送到伺服器端, 然後讀取伺服器端的響應資源。 在

[Python]網路爬蟲urllib2的使用細節與站技巧

前面說到了urllib2的簡單入門,下面整理了一部分urllib2的使用細節。 1.Proxy 的設定 urllib2 預設會使用環境變數 http_proxy 來設定 HTTP Proxy。 如果想在程式中明確控制 Proxy 而不受環境變數的影響,可以使用代理。

[Python]網路爬蟲網頁的含義和URL基本構成

一、網路爬蟲的定義 網路爬蟲,即Web Spider,是一個很形象的名字。 把網際網路比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。 網路蜘蛛是通過網頁的連結地址來尋找網頁的。 從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址

Python網路爬蟲chromdriver.exe與chrome版本對映及下載連結

前言:最近正在學習Python網路爬蟲,學到selenium,需要用到chrome瀏覽器的驅動,但是網上的很多地址都被牆了,而且沒有準確的驅動和chrome版本的對映,很麻煩。現在我已經解決了這些問題,現在把對映和下載連結分享出來。 (一)檢視chrome

Python網路爬蟲視訊下載器

這一節實現一個下載 iqiyi VIP視訊的爬蟲。 需要的準備:旋風視訊VIP解析網站或其他解析網站 原理理解: 在視訊解析網站獲取視訊的過程中,首先會向視訊伺服器傳送GET請求,獲得伺服器發來的資訊;接到資訊後,再向伺服器POST資料,即將類似於密碼

Python網路爬蟲頂點小說網站全部小說,並存入MongoDB

前言:本篇部落格將爬取頂點小說網站全部小說、涉及到的問題有:Scrapy架構、斷點續傳問題、Mongodb資料庫相關操作。 背景: Python版本:Anaconda3 執行平臺:Windows IDE:PyCharm 資料庫:MongoDB 瀏

Python網路爬蟲selenium+chrome爬美女圖片

說明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因為是模擬瀏覽器訪問,chrome需要再下載一個驅動,具體方式在我的上一篇部落格,內容很詳細。傳送門:Python網路爬蟲(

Python網路爬蟲解決ImportError:DLL load failed作業系統無法執行問題

背景: Python版本:Anaconda3 問題描述: 最近在執行scrapy專案時,本來安裝好好的scrapy框架突然報錯,猝不及防, ImportError:DLL load failed:作業系統無法執行%1 如圖: 自己也是百思

[Python]網路爬蟲使用cookiejar管理cookie 以及 模擬登入知乎

大家好哈,上一節我們研究了一下爬蟲的異常處理問題,那麼接下來我們一起來看一下Cookie的使用。 為什麼要使用Cookie呢? Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密) 比如說有些網站需要登入後才

[Python]網路爬蟲Opener與Handler

在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info and geturl  urlopen返回的應答物件response(或者HTTPError例項)有兩個很有用的方法info()和geturl() 1.geturl(): geturl()返回獲

python網路爬蟲11近期電影票房或熱度資訊爬

目標意義 為了理解動態網站中一些資料如何獲取,做一個簡單的分析。 說明 思路,原始程式碼來源於:https://book.douban.com/subject/27061630/。 構造-下載器 構造分下載器,下載原始網頁,用於原始網頁的獲取,動態網頁中,js部分的響應獲取。 通過瀏覽器模仿,合理

Python和C|C++的混編利用Cython進行混編

cde uil 有時 當前 class def 將在 python 混編 還能夠使用Cython來實現混編 1 下載Cython。用python setup.py install進行安裝 2 一個實例 ① 創建helloworld文件夾創建hellowor

Python爬蟲爬蟲獲取資料儲存到檔案

接上一篇文章:Python爬蟲(一):編寫簡單爬蟲之新手入門 前言: 上一篇文章,我爬取到了豆瓣官網的頁面程式碼,我在想怎樣讓爬取到的頁面顯示出來呀,爬到的資料是html頁面程式碼,不如將爬取到的程式碼儲存到一個檔案中,檔案命名為html格式,那直接開啟這個檔案就可以在瀏覽器上看到爬取資料的

Python爬蟲Scrapy框架的配置安裝

Windows安裝方式 預設支援Python2、Python3,通過pip安裝Csrapy框架: pip install Scrapy Ubuntu(9.10以上版本)安裝方式 預設支援Python2、Python3,通過pip安裝Csrapy框架: sud

python手記requests寫爬蟲bs4處理文字資料

人生無趣且不易,一起找點樂子吧。歡迎評論,和文章無關的也可以。       上篇介紹了requests的基本用法,最後我們獲得了網頁的原始碼,並將其存到了文字中: 但是,我們需要的並不是全部的程式碼,我們需要的是文章的那一部分。其實requ

網路爬蟲】【java】微博爬蟲如何HTML頁面及HttpClient使用

一、寫在前面         上篇文章以網易微博爬蟲為例,給出了一個很簡單的微博爬蟲的爬取過程,大概說明了網路爬蟲其實也就這麼回事,或許初次看到這個例子覺得有些複雜,不過沒有關係,上篇文章給的例子只是讓大家對爬蟲過程有所瞭解。接下來的系列裡,將一步一步地剖析每個過程。 現

linux網路程式設計之TCP/IP基礎利用ARP和ICMP協議解釋ping命令

一、MTU 乙太網和IEEE 802.3對資料幀的長度都有限制,其最大值分別是1500和1492位元組,將這個限制稱作最大傳輸單元(MTU,Maximum Transmission Unit)。如果I

網路爬蟲Python中的正則表示式教程

接下來準備用糗百做一個爬蟲的小例子。 但是在這之前,先詳細的整理一下Python中的正則表示式的相關內容。 正則表示式在Python爬蟲中的作用就像是老師點名時用的花名冊一樣,是必不可少的神兵利器。 整理時沒有注意,實在抱歉。 一、 正則表示式基礎 1.1.概

Python爬蟲Requests庫

所謂爬蟲就是模擬客戶端傳送網路請求,獲取網路響應,並按照一定的規則解析獲取的資料並儲存的程式。要說 Python 的爬蟲必然繞不過 Requests 庫。 1 簡介 對於 Requests 庫,官方文件是這麼說的: Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。 警告