自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

2019 網(wǎng)絡爬蟲和相關工具

開發(fā) 開發(fā)工具
網(wǎng)絡爬蟲(web crawler),以前經(jīng)常稱之為網(wǎng)絡蜘蛛(spider),是按照一定的規(guī)則自動瀏覽萬維網(wǎng)并獲取信息的機器人程序(或腳本),曾經(jīng)被廣泛的應用于互聯(lián)網(wǎng)搜索引擎。

 [[267706]]

網(wǎng)絡爬蟲

網(wǎng)絡爬蟲(web crawler),以前經(jīng)常稱之為網(wǎng)絡蜘蛛(spider),是按照一定的規(guī)則自動瀏覽萬維網(wǎng)并獲取信息的機器人程序(或腳本),曾經(jīng)被廣泛的應用于互聯(lián)網(wǎng)搜索引擎。使用過互聯(lián)網(wǎng)和瀏覽器的人都知道,網(wǎng)頁中除了供用戶閱讀的文字信息之外,還包含一些超鏈接。網(wǎng)絡爬蟲系統(tǒng)正是通過網(wǎng)頁中的超鏈接信息不斷獲得網(wǎng)絡上的其它頁面。正因如此,網(wǎng)絡數(shù)據(jù)采集的過程就像一個爬蟲或者蜘蛛在網(wǎng)絡上漫游,所以才被形象的稱為網(wǎng)絡爬蟲或者網(wǎng)絡蜘蛛。

爬蟲的應用領域

在理想的狀態(tài)下,所有ICP(Internet Content Provider)都應該為自己的網(wǎng)站提供API接口來共享它們允許其他程序獲取的數(shù)據(jù),在這種情況下爬蟲就不是必需品,國內(nèi)比較有名的電商平臺(如淘寶、京東等)、社交平臺(如騰訊微博等)等網(wǎng)站都提供了自己的Open API,但是這類Open API通常會對可以抓取的數(shù)據(jù)以及抓取數(shù)據(jù)的頻率進行限制。對于大多數(shù)的公司而言,及時的獲取行業(yè)相關數(shù)據(jù)是企業(yè)生存的重要環(huán)節(jié)之一,然而大部分企業(yè)在行業(yè)數(shù)據(jù)方面的匱乏是其與生俱來的短板,合理的利用爬蟲來獲取數(shù)據(jù)并從中提取出有商業(yè)價值的信息是至關重要的。當然爬蟲還有很多重要的應用領域,下面列舉了其中的一部分:

  1. 搜索引擎
  2. 新聞聚合
  3. 社交應用
  4. 輿情監(jiān)控
  5. 行業(yè)數(shù)據(jù)

合法性和背景調(diào)研

爬蟲合法性探討

網(wǎng)絡爬蟲領域目前還屬于拓荒階段,雖然互聯(lián)網(wǎng)世界已經(jīng)通過自己的游戲規(guī)則建立起一定的道德規(guī)范(Robots協(xié)議,全稱是“網(wǎng)絡爬蟲排除標準”),但法律部分還在建立和完善中,也就是說,現(xiàn)在這個領域暫時還是灰色地帶。

“法不禁止即為許可”,如果爬蟲就像瀏覽器一樣獲取的是前端顯示的數(shù)據(jù)(網(wǎng)頁上的公開信息)而不是網(wǎng)站后臺的私密敏感信息,就不太擔心法律法規(guī)的約束,因為目前大數(shù)據(jù)產(chǎn)業(yè)鏈的發(fā)展速度遠遠超過了法律的完善程度。

在爬取網(wǎng)站的時候,需要限制自己的爬蟲遵守Robots協(xié)議,同時控制網(wǎng)絡爬蟲程序的抓取數(shù)據(jù)的速度;在使用數(shù)據(jù)的時候,必須要尊重網(wǎng)站的知識產(chǎn)權(從Web 2.0時代開始,雖然Web上的數(shù)據(jù)很多都是由用戶提供的,但是網(wǎng)站平臺是投入了運營成本的,當用戶在注冊和發(fā)布內(nèi)容時,平臺通常就已經(jīng)獲得了對數(shù)據(jù)的所有權、使用權和分發(fā)權)。如果違反了這些規(guī)定,在打官司的時候敗訴幾率相當高。

Robots.txt文件

大多數(shù)網(wǎng)站都會定義robots.txt文件,下面以淘寶的robots.txt文件為例,看看該網(wǎng)站對爬蟲有哪些限制。

  1. User-agent:  Baiduspider 
  2. Allow:  /article 
  3. Allow:  /oshtml 
  4. Disallow:  /product/ 
  5. Disallow:  / 
  6.  
  7. User-Agent:  Googlebot 
  8. Allow:  /article 
  9. Allow:  /oshtml 
  10. Allow:  /product 
  11. Allow:  /spu 
  12. Allow:  /dianpu 
  13. Allow:  /oversea 
  14. Allow:  /list 
  15. Disallow:  / 
  16.  
  17. User-agent:  Bingbot 
  18. Allow:  /article 
  19. Allow:  /oshtml 
  20. Allow:  /product 
  21. Allow:  /spu 
  22. Allow:  /dianpu 
  23. Allow:  /oversea 
  24. Allow:  /list 
  25. Disallow:  / 
  26.  
  27. User-Agent:  360Spider 
  28. Allow:  /article 
  29. Allow:  /oshtml 
  30. Disallow:  / 
  31.  
  32. User-Agent:  Yisouspider 
  33. Allow:  /article 
  34. Allow:  /oshtml 
  35. Disallow:  / 
  36.  
  37. User-Agent:  Sogouspider 
  38. Allow:  /article 
  39. Allow:  /oshtml 
  40. Allow:  /product 
  41. Disallow:  / 
  42.  
  43. User-Agent:  Yahoo!  Slurp 
  44. Allow:  /product 
  45. Allow:  /spu 
  46. Allow:  /dianpu 
  47. Allow:  /oversea 
  48. Allow:  /list 
  49. Disallow:  / 
  50.  
  51. User-Agent:  * 
  52. Disallow:  / 

注意上面robots.txt第一段的最后一行,通過設置“Disallow: /”禁止百度爬蟲訪問除了“Allow”規(guī)定頁面外的其他所有頁面。因此當你在百度搜索“淘寶”的時候,搜索結(jié)果下方會出現(xiàn):“由于該網(wǎng)站的robots.txt文件存在限制指令(限制搜索引擎抓取),系統(tǒng)無法提供該頁面的內(nèi)容描述”。百度作為一個搜索引擎,至少在表面上遵守了淘寶網(wǎng)的robots.txt協(xié)議,所以用戶不能從百度上搜索到淘寶內(nèi)部的產(chǎn)品信息。

 

相關工具介紹

HTTP協(xié)議

在開始講解爬蟲之前,我們稍微對HTTP(超文本傳輸協(xié)議)做一些回顧,因為我們在網(wǎng)頁上看到的內(nèi)容通常是瀏覽器執(zhí)行HTML語言得到的結(jié)果,而HTTP就是傳輸HTML數(shù)據(jù)的協(xié)議。HTTP和其他很多應用級協(xié)議一樣是構(gòu)建在TCP(傳輸控制協(xié)議)之上的,它利用了TCP提供的可靠的傳輸服務實現(xiàn)了Web應用中的數(shù)據(jù)交換。按照維基百科上的介紹,設計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法,也就是說這個協(xié)議是瀏覽器和Web服務器之間傳輸?shù)臄?shù)據(jù)的載體。關于這個協(xié)議的詳細信息以及目前的發(fā)展狀況,大家可以閱讀阮一峰老師的《HTTP 協(xié)議入門》、《互聯(lián)網(wǎng)協(xié)議入門》系列以及《圖解HTTPS協(xié)議》進行了解,下圖是我在四川省網(wǎng)絡通信技術重點實驗室工作期間用開源協(xié)議分析工具Ethereal(抓包工具WireShark的前身)截取的訪問百度首頁時的HTTP請求和響應的報文(協(xié)議數(shù)據(jù)),由于Ethereal截取的是經(jīng)過網(wǎng)絡適配器的數(shù)據(jù),因此可以清晰的看到從物理鏈路層到應用層的協(xié)議數(shù)據(jù)。

HTTP請求(請求行+請求頭+空行+[消息體]):

 

HTTP響應(響應行+響應頭+空行+消息體):

 

說明:但愿這兩張如同泛黃的照片般的截圖幫助你大概的了解到HTTP是一個怎樣的協(xié)議。

相關工具

1.Chrome Developer Tools:谷歌瀏覽器內(nèi)置的開發(fā)者工具。

 

2.POSTMAN:功能強大的網(wǎng)頁調(diào)試與RESTful請求工具。

 

3.

4.HTTPie:命令行HTTP客戶端。

  1. $ http --header http://www.scu.edu.cn 
  2. HTTP/1.1 200 OK 
  3. Accept-Ranges: bytes 
  4. Cache-Control: private, max-age=600 
  5. Connection: Keep-Alive 
  6. Content-Encoding: gzip 
  7. Content-Language: zh-CN 
  8. Content-Length: 14403 
  9. Content-Type: text/html 
  10. Date: Sun, 27 May 2018 15:38:25 GMT 
  11. ETag: "e6ec-56d3032d70a32-gzip" 
  12. Expires: Sun, 27 May 2018 15:48:25 GMT 
  13. Keep-Alive: timeout=5, max=100 
  14. Last-Modified: Sun, 27 May 2018 13:44:22 GMT 
  15. Server: VWebServer 
  16. Vary: User-Agent,Accept-Encoding 
  17. X-Frame-Options: SAMEORIGIN 

5.BuiltWith:識別網(wǎng)站所用技術的工具。

  1. >>> import builtwith 
  2. >>> builtwith.parse('http://www.bootcss.com/'
  3. {'web-servers': ['Nginx'], 'font-scripts': ['Font Awesome'], 'javascript-frameworks': ['Lo-dash''Underscore.js''Vue.js''Zepto''jQuery'], 'web-frameworks': ['Twitter Bootstrap']} 
  4. >>> 
  5. >>> import ssl 
  6. >>> ssl._create_default_https_context = ssl._create_unverified_context 
  7. >>> builtwith.parse('https://www.jianshu.com/'
  8. {'web-servers': ['Tengine'], 'web-frameworks': ['Twitter Bootstrap''Ruby on Rails'], 'programming-languages': ['Ruby']} 

6.python-whois:查詢網(wǎng)站所有者的工具。

  1. >>> import whois 
  2. >>> whois.whois('baidu.com'
  3. {'domain_name': ['BAIDU.COM''baidu.com'], 'registrar''MarkMonitor, Inc.''whois_server''whois.markmonitor.com''referral_url': None, 'updated_date': [datetime.datetime(2017, 7, 28, 2, 36, 28), datetime.datetime(2017, 7, 27, 19, 36, 28)], 'creation_date': [datetime.datetime(1999, 10, 11, 11, 5, 17), datetime.datetime(1999, 10, 11, 4, 5, 17)], 'expiration_date': [datetime.datetime(2026, 10, 11, 11, 5, 17), datetime.datetime(2026, 10, 11, 0, 0)], 'name_servers': ['DNS.BAIDU.COM''NS2.BAIDU.COM''NS3.BAIDU.COM''NS4.BAIDU.COM''NS7.BAIDU.COM''dns.baidu.com''ns4.baidu.com''ns3.baidu.com''ns7.baidu.com''ns2.baidu.com'], 'status': ['clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited''clientTransferProhibited https://icann.org/epp#clientTransferProhibited''clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited''serverDeleteProhibited https://icann.org/epp#serverDeleteProhibited''serverTransferProhibited https://icann.org/epp#serverTransferProhibited''serverUpdateProhibited https://icann.org/epp#serverUpdateProhibited''clientUpdateProhibited (https://www.icann.org/epp#clientUpdateProhibited)''clientTransferProhibited (https://www.icann.org/epp#clientTransferProhibited)''clientDeleteProhibited (https://www.icann.org/epp#clientDeleteProhibited)''serverUpdateProhibited (https://www.icann.org/epp#serverUpdateProhibited)''serverTransferProhibited (https://www.icann.org/epp#serverTransferProhibited)''serverDeleteProhibited (https://www.icann.org/epp#serverDeleteProhibited)'], 'emails': ['abusecomplaints@markmonitor.com''whoisrelay@markmonitor.com'], 'dnssec''unsigned''name': None, 'org''Beijing Baidu Netcom Science Technology Co., Ltd.''address': None, 'city': None, 'state''Beijing''zipcode': None, 'country''CN'

7.robotparser:解析robots.txt的工具。

  1. >>> from urllib import robotparser 
  2. >>> parser = robotparser.RobotFileParser() 
  3. >>> parser.set_url('https://www.taobao.com/robots.txt'
  4. >>> parser.read() 
  5. >>> parser.can_fetch('Hellokitty''http://www.taobao.com/article'
  6. False 
  7. >>> parser.can_fetch('Baiduspider''http://www.taobao.com/article'
  8. True 
  9. >>> parser.can_fetch('Baiduspider''http://www.taobao.com/product'
  10. False 

一個簡單的爬蟲

一個基本的爬蟲通常分為數(shù)據(jù)采集(網(wǎng)頁下載)、數(shù)據(jù)處理(網(wǎng)頁解析)和數(shù)據(jù)存儲(將有用的信息持久化)三個部分的內(nèi)容,當然更為高級的爬蟲在數(shù)據(jù)采集和處理時會使用并發(fā)編程或分布式技術,這就需要有調(diào)度器(安排線程或進程執(zhí)行對應的任務)、后臺管理程序(監(jiān)控爬蟲的工作狀態(tài)以及檢查數(shù)據(jù)抓取的結(jié)果)等的參與。

 

一般來說,爬蟲的工作流程包括以下幾個步驟:

  1. 設定抓取目標(種子頁面/起始頁面)并獲取網(wǎng)頁。
  2. 當服務器無法訪問時,按照指定的重試次數(shù)嘗試重新下載頁面。
  3. 在需要的時候設置用戶代理或隱藏真實IP,否則可能無法訪問頁面。
  4. 對獲取的頁面進行必要的解碼操作然后抓取出需要的信息。
  5. 在獲取的頁面中通過某種方式(如正則表達式)抽取出頁面中的鏈接信息。
  6. 對鏈接進行進一步的處理(獲取頁面并重復上面的動作)。
  7. 將有用的信息進行持久化以備后續(xù)的處理。

下面的例子給出了一個從“搜狐體育”上獲取NBA新聞標題和鏈接的爬蟲。

  1. from urllib.error import URLError 
  2. from urllib.request import urlopen 
  3.  
  4. import re 
  5. import pymysql 
  6. import ssl 
  7.  
  8. from pymysql import Error 
  9.  
  10.  
  11. # 通過指定的字符集對頁面進行解碼(不是每個網(wǎng)站都將字符集設置為utf-8) 
  12. def decode_page(page_bytes, charsets=('utf-8',)): 
  13.     page_html = None 
  14.     for charset in charsets: 
  15.         try: 
  16.             page_html = page_bytes.decode(charset) 
  17.             break 
  18.         except UnicodeDecodeError: 
  19.             pass 
  20.             # logging.error('Decode:', error) 
  21.     return page_html 
  22.  
  23.  
  24. # 獲取頁面的HTML代碼(通過遞歸實現(xiàn)指定次數(shù)的重試操作) 
  25. def get_page_html(seed_url, *, retry_times=3, charsets=('utf-8',)): 
  26.     page_html = None 
  27.     try: 
  28.         page_html = decode_page(urlopen(seed_url).read(), charsets) 
  29.     except URLError: 
  30.         # logging.error('URL:', error) 
  31.         if retry_times > 0: 
  32.             return get_page_html(seed_url, retry_times=retry_times - 1, 
  33.                                  charsets=charsets) 
  34.     return page_html 
  35.  
  36.  
  37. # 從頁面中提取需要的部分(通常是鏈接也可以通過正則表達式進行指定) 
  38. def get_matched_parts(page_html, pattern_str, pattern_ignore_case=re.I): 
  39.     pattern_regex = re.compile(pattern_str, pattern_ignore_case) 
  40.     return pattern_regex.findall(page_html) if page_html else [] 
  41.  
  42.  
  43. # 開始執(zhí)行爬蟲程序并對指定的數(shù)據(jù)進行持久化操作 
  44. def start_crawl(seed_url, match_pattern, *, max_depth=-1): 
  45.     conn = pymysql.connect(host='localhost', port=3306, 
  46.                            database='crawler'user='root'
  47.                            password='123456', charset='utf8'
  48.     try: 
  49.         with conn.cursor() as cursor
  50.             url_list = [seed_url] 
  51.             # 通過下面的字典避免重復抓取并控制抓取深度 
  52.             visited_url_list = {seed_url: 0} 
  53.             while url_list: 
  54.                 current_url = url_list.pop(0) 
  55.                 depth = visited_url_list[current_url] 
  56.                 if depth != max_depth: 
  57.                     # 嘗試用utf-8/gbk/gb2312三種字符集進行頁面解碼 
  58.                     page_html = get_page_html(current_url, charsets=('utf-8''gbk''gb2312')) 
  59.                     links_list = get_matched_parts(page_html, match_pattern) 
  60.                     param_list = [] 
  61.                     for link in links_list: 
  62.                         if link not in visited_url_list: 
  63.                             visited_url_list[link] = depth + 1 
  64.                             page_html = get_page_html(link, charsets=('utf-8''gbk''gb2312')) 
  65.                             headings = get_matched_parts(page_html, r'<h1>(.*)<span'
  66.                             if headings: 
  67.                                 param_list.append((headings[0], link)) 
  68.                     cursor.executemany('insert into tb_result values (default, %s, %s)'
  69.                                        param_list) 
  70.                     conn.commit() 
  71.     except Error: 
  72.         pass 
  73.         # logging.error('SQL:', error) 
  74.     finally: 
  75.         conn.close() 
  76.  
  77.  
  78. def main(): 
  79.     ssl._create_default_https_context = ssl._create_unverified_context 
  80.     start_crawl('http://sports.sohu.com/nba_a.shtml'
  81.                 r'<a[^>]+test=a\s[^>]*href=["\'](.*?)["\']'
  82.                 max_depth=2) 
  83.  
  84.  
  85. if __name__ == '__main__'
  86.     main() 

由于使用了MySQL實現(xiàn)持久化操作,所以要先啟動MySQL服務器再運行該程序。

責任編輯:武曉燕 來源: 開源測試聯(lián)盟
相關推薦

2024-07-02 11:32:38

2024-11-22 16:06:21

2010-06-13 14:47:15

2018-01-30 18:15:12

Python網(wǎng)絡爬蟲gevent

2018-02-23 14:30:13

2018-05-14 15:27:06

Python網(wǎng)絡爬蟲爬蟲架構(gòu)

2010-06-29 15:51:22

Linux SNMP協(xié)

2023-06-01 13:15:23

2019-01-30 11:37:14

深度學習工具人工智能

2022-09-20 07:02:20

網(wǎng)絡爬蟲反爬蟲

2019-11-14 07:20:19

惡意軟件網(wǎng)絡安全勒索軟件

2019-03-25 05:38:34

絡犯罪惡意軟件網(wǎng)絡安全

2022-08-08 11:53:51

數(shù)據(jù)沿襲數(shù)據(jù)

2019-06-28 08:56:35

編程語言框架工具

2024-11-27 06:31:02

2011-03-09 10:07:56

網(wǎng)絡爬蟲Java

2012-06-13 17:38:57

2010-04-20 11:40:52

網(wǎng)絡爬蟲

2019-03-19 15:32:26

Hyper-V監(jiān)控工具虛擬化

2016-08-18 00:21:12

網(wǎng)絡爬蟲抓取網(wǎng)絡
點贊
收藏

51CTO技術棧公眾號