1. 程式人生 > >用python語言編寫網路爬蟲

用python語言編寫網路爬蟲

         本文主要用到python3自帶的urllib模組編寫輕量級的簡單爬蟲。至於怎麼定位一個網頁中具體元素的url可自行百度火狐瀏覽器的firebug外掛或者谷歌瀏覽器的自帶方法。

1、訪問一個網址

re=urllib.request.urlopen('網址‘)

開啟的也可以是個urllib.request.Request物件,後邊也可以跟資料引數,當有傳入資料時會自動變為POST請求;

2、urllib.request.Request(url,data=None,headers={})物件屬性和方法

 1     full_url
 2     type
 3
host 4 data 5 selector 6 method 7 get_method() 8 add_header(key,val) 9 add_unredirected_header(key,header) 10 has_header(header) 11 remove_header(header) 12 get_full_url(header) 13 set_proxy(host,type) 14 get_header(header_name,default=None)
15   header_items()   

3、已連線物件的可用方法:

1 re.read()             讀取內容,想要將內容儲存下來,需先新建一個相應格式的檔案,再將讀取到的內容寫入到這個檔案內即可;
2 re.geturl()            可取得已開啟物件的url地址;
3 re.info()             可取得響應伺服器的資訊;
4 re.getcode()           可取得響應狀態碼;
5 urllib.parse.urlencode()  將一個儲存post資料的字典轉換成開啟網頁所需要的資料格式;

可用json.loads()將文字轉換成鍵值對

可在傳地址時將header以一個字典資料的形式傳入,以隱藏自己的訪問方式;也可用re.add_header('')    的方式進行追加;

4、當知道一個檔案的url時可用此方法直接下載儲存到本地

urllib.request.urlretrieve('http://wx1.sinaimg.cn/mw600/9bbc284bgy1ffkuafn4xtj20dw0jgh08.jpg','bc.jpg')

5、登入功能的實現(post)

(1)利用session保留登入狀態

1 login_data = {
2             '_xsrf': getXSRF(baseurl),
3             'password': password,
4             'remember_me': 'true',
5             'email': email,
6 session = requests.session()
7 content = session.post(url, headers = headers_base, data = login_data)
8 s = session.get("http://www.zhihu.com", verify = False)
9 print s.text.encode('utf-8')

(2)利用cookie進行登入

 1 post = {
 2             'ua':self.ua,
 3             'TPL_checkcode':'',
 4             'CtrlVersion': '1,0,0,7',
 5             'TPL_password':'',
 6 }
 7 #將POST的資料進行編碼轉換
 8 postData = urllib.urlencode(post)
 9 cookie = cookielib.LWPCookieJar()
10 cookieHandler = urllib2.HTTPCookieProcessor(cookie)
11 opener = urllib2.build_opener(cookieHandler, urllib2.HTTPHandler)
12 #第一次登入獲取驗證碼嘗試,構建request
13 request = urllib2.Request(loginURL,postData,loginHeaders)
14 #得到第一次登入嘗試的相應
15 response = self.opener.open(request)
16 #獲取其中的內容
17 content = response.read().decode('gbk')
18  

網站常用的編碼方式有utf8,gbk,gb2132,gb18030等

6、代理的使用

同一個Ip裝置在短時間內訪問一個伺服器次數過多會被伺服器禁止訪問,所以很多時候我們都需要用天代理來幫助我們解決這個問題。方法如下:

1 proxy_support = urllib.request.ProxyHandler({型別:代理ip和埠號})
2 opner = urllib.request.build_opener(proxy_suppoert)
3 urllib.request.install_opener(opener)  #可選安裝
4 opener.open(url)        #或直接呼叫opener代理

注:如想實現更復雜的可使用更全面的scrapy框架。

附:自己寫的一個驗證網上代理的有效性的爬蟲,此爬蟲先從網站上獲取代理的地址,然後使用這個代理來訪問百度,驗證是否能得到百度的網頁,如能則將此代理地址儲存。

 1 import threading,time,pickle,re
 2 import urllib.request
 3 
 4 class ProxyCheck(threading.Thread):
 5     def __init__(self,proxylist):
 6         threading.Thread.__init__(self)
 7         self.proxylist = proxylist
 8         self.timeout = 5
 9         self.test_url = 'http://www.baidu.com'
10         self.test_str = '11000002000001'
11         self.checkedProxyList = []
12 
13     def checkProxy(self):
14         cookies = urllib.request.HTTPCookieProcessor()
15         for proxy in self.proxylist:
16             proxy_handler = urllib.request.ProxyHandler({'http':r'%s://%s:%s' %(proxy[0],proxy[1],proxy[2])})
17             opener = urllib.request.build_opener(cookies,proxy_handler)
18             opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
19                                                 '(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')]
20             urllib.request.install_opener(opener)
21             t1 = time.time()
22             try:
23                 req = urllib.request.urlopen(self.test_url,timeout=self.timeout)
24                 result = req.read().decode('utf-8')
25                 timeused = time.time() - t1
26                 pos = result.find(self.test_str)
27                 if pos > 1:
28                     self.checkedProxyList.append((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
29                     print((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
30                 else:
31                     continue
32             except:
33                 continue
34     # def sort(self):
35     #     sorted(self.checkedProxyList,cmp=lambda x,y:cmp(x[4],y[4]))
36     def save(self,filename):
37         with open("%s.txt"%filename,'w') as f:
38             for proxy in self.checkedProxyList:
39                 f.write("{}\t{}:{}\t{}\t{}\n".format(*proxy))
40         with open("%s.pickle"%filename,'wb') as fb:
41             pickle.dump(self.checkedProxyList,fb)
42 
43     def run(self):
44         self.checkProxy()
45         self.save("checked-50")
46 
47 
48 class xiciProxy:
49     def __init__(self):
50         self.alllist = []
51     def grep(self,url):
52         # req = urllib.request.Request(url)
53         # req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
54         #                             '(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')
55 
56 
57         result1 = urllib.request.urlopen(req)
58         result2 = result1.read().decode('utf-8')
59 
60         regex = r"<td>(\d+.\d+.\d+.\d+)</td>\n.*?" \
61                 r"<td>(\d+)</td>\n.*?" \
62                 r"\n.*?" \
63                 r"<a href=.*?>(.*?)</a>\n.*?" \
64                 r"\n.*?" \
65                 r"\n.*?" \
66                 r"<td>(HTTPS?)</td>"
67         get = re.findall(regex,result2)
68         proxylist = []
69         for i in get:
70             proxylist.append((i[3],i[0],i[1],i[2]))
71         return proxylist
72     def save(self,filename):
73         with open("%s.txt"%filename,'w') as f:
74             for proxy in self.alllist:
75                 f.write("{}\t{}:{}\t{}\n".format(*proxy))
76         with open("%s.pickle"%filename,'wb') as fb:
77             pickle.dump(self.alllist,fb)
78     def run(self):
79         for i in range(51,1951):
80             url = "http://www.xicidaili.com/nn/{}".format(i)
81             print(url)
82             proxylist = self.grep(url)
83             self.alllist += proxylist
84             if i % 50 == 0:
85                 self.save("xiciproxy-{}".format(i))
86                 self.alllist = []
87 
88 with open("xiciproxy-50.pickle","rb") as fb:
89     proxylist = pickle.load(fb)
90 ProxyCheck(proxylist).run()
View Code

相關推薦

python語言編寫網路爬蟲

         本文主要用到python3自帶的urllib模組編寫輕量級的簡單爬蟲。至於怎麼定位一個網頁中具體元素的url可自行百度火狐瀏覽器的firebug外掛或者谷歌瀏覽器的自帶方法。 1、訪問一個網址 re=urllib.request.urlopen('網址‘) 開啟的也可以是個urll

一個Python語言編寫的簡單的資料庫

如果我們想將資料簡單的儲存起來(建立一個簡單的資料庫),可以使用python語言的模組shelve來完成大部分工作。 shelve模組裡面應用最廣泛的函式是open,它將一個檔名作為引數,並返回一個shelf物件,供我們來儲存資料。就像操作普通字典那樣來操作它

python零基礎寫爬蟲--編寫第一個網絡爬蟲

等待 客戶端瀏覽器 身份驗證 1.2 不存在 ssp 地址 執行c ade 首先要說明的是,一下代碼是在python2.7版本下檢測的 一.最簡單的爬蟲程序 --下載網頁 import urllib2 request=urllib2.Request("http://www.

Python編寫網路爬蟲帶model

Python編寫網路爬蟲帶model 以http://zuidazy.net電影網站為例,實現步驟如下: 一、分析網站: 分析網站的程式碼結構:如網址,需要採集的程式碼取,建設使用谷歌瀏覽器 如圖: 解釋:1.為網址欄,分析網址的相同部分及不同部分 2.為按F12檢視原始碼,為需

Python語言編寫多行Unicode字串表示下面的唐詩’靜夜思‘並列印

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

Python實戰(一)——Python編寫網路爬蟲

實戰內容針對不需要login的靜態網頁爬取。避免抓取登入、ajax非同步載入的內容。 一、抓取程式主要模組組成    1、url管理器 :管理已抓取、未抓取的url連線,避免重複、迴圈抓取    2、網頁下載器 urllib2:下載url網頁資料    3、網頁解析器

Python語言設計GUI界面

list head for qt4 雙擊 data- com http 彈出 我們大家都編寫過程序,但是如果能夠設計一個GUI界面,會使程序增添一個很大的亮點!今天就讓我們來用目前十分流行的python語言寫出一個最基本的GUI,為日後設計更加漂亮的GUI打下基礎。

所有語言編寫hello world

日常[請添加鏈接描述]()剛看了一節python的視頻,老師用各種編程語言運行hello world。老師說每次學新語言都要編hello world,這是一種神聖的儀式。我也希望未來有一天我也能用所有語言編寫一遍。老師說c++是用途最廣的語言程序,是c語言的延伸,我即將學習它也會熟練的掌握它。雖然老師的視頻才

C#語言編寫:數組分析器

find 操作 fin numbers 排序 ole class 數字 輸入 static void Main(string[] args) { #region 創建數組 Console.Write("請輸入數組的

C#語言編寫:集合管理器

list 管理 main 繼續 console reac 提示 回車 read static void Main(string[] args) { List<int> numbers = new List<int>

c#語言編寫水仙花數

sta program for eric eap write 水仙花 ogr ati using System;using System.Collections.Generic;using System.Linq;using System.Text;using System

cp&tar&c語言編寫程序 實現cp命令的效果

none des tdi 文件內容 display 我們 class pan fop 1.cp (拷貝) 已存在文件路徑 要拷貝的文件路徑 實現cp命令的代碼如下: 2 #include <stdio.h>

python語言寫一個簡單的計算器

ali pla ket 列表 調用 語言 括號 lac 跳出循環 假如我們有這樣一個式子: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )思

C語言編寫簡單遊戲——三子棋

      先簡單介紹一下三子棋的規則,方便我們接下來的程式設計和理解。規則如下:   在九宮格棋盤上,只要將自己的三個棋子走成一條線(橫、豎、對角線),對方就算輸了。   規則很簡單,但是我們應

python實戰之網路爬蟲(爬取新聞內文資訊)

(1)前期準備:開啟谷歌瀏覽器,進入新浪新聞網國內新聞頁面,點選進入其中一條新聞,開啟開發者工具介面。獲取當前網頁資料,然後使用BeautifulSoup進行剖析,程式碼: import requests from bs4 import BeautifulSoup res = requests.

python實戰之網路爬蟲(爬取網頁新聞資訊列表)

關於大資料時代的資料探勘 (1)為什麼要進行資料探勘:有價值的資料並不在本地儲存,而是分佈在廣大的網路世界,我們需要將網路世界中的有價值資料探勘出來供自己使用 (2)非結構化資料:網路中的資料大多是非結構化資料,如網頁中的資料都沒有固定的格式 (3)非結構化資料的挖掘--ETL:即三個步

Python語言對任意影象進行m*n的均勻分塊(思路非常清晰,步驟簡單)

目錄 1.讀取原始影象 2.網格劃分,將影象劃分為m*n塊 2.1分塊後圖像的儲存問題 2.2影象的裁剪 2.3影象長寬的整除問題 方法一:四捨五入法

python語言來判斷一個數是否是水仙花數?

#用python語言來判斷一個數是否是水仙花數? #水仙花數: # 1) 一個三位正整數 ( 即取值區間 [100,1000) ) # 2) 個位數字的立方+十位數字的立方+百位數字的立方=它本身  (即數字 abc = a**3 + b**3 + c**3) 程式碼: for

輸入一行字元分別統計出其中英文字母、空格、數字和其他字元的個數。(c++語言編寫程式)【寫的第1篇部落格,很高興

#include<stdio.h> int main() { char ch; //定義ch為字元型變數 int a=0,b=0,c=0,d=0; //定義a,b,c,d為整型變數並賦初值 while(scanf("%c",&ch),ch!=’\n’) //輸入字元直到c

使用C(或C++)語言編寫網路通訊模擬程式

實驗題目 綜合實驗 一、實驗目的 熟悉和掌握網路程式設計的基本方法和步驟;進一步理解 client/server 互動模式;加深學生對於網路協議概念的理解以及協議的設計和實現方法。   二、裝置與環境 微型計算機、Win