Python編寫網絡爬蟲--牛刀小試

   本文參考網上的資料,編寫簡單的Python編寫網絡爬蟲,做了網頁內容的抓取,分析出鏈接的url並抓取。

      1.環境準備

          安裝python3,PyCharm開發環境

      2.牛刀小試:          

# encoding:UTF-8
import urllib.request         #引入urllib工具

url = "http://www.baidu.com" #Url地址
data = urllib.request.urlopen(url).read()  # 使用urllib工具獲取url的頁面內容
data = data.decode('UTF-8')       #將格式轉換爲UTF-8格式
print(data)                 # 打印獲取的頁面信息

      輸出結果:

<html>
<head>
    
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
	<meta content="always" name="referrer">
    <meta name="theme-color" content="#2932e1">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
    <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /> 
    <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg">
	
	
	<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
	<link rel="dns-prefetch" href="//t1.baidu.com"/>
	<link rel="dns-prefetch" href="//t2.baidu.com"/>
	<link rel="dns-prefetch" href="//t3.baidu.com"/>
	<link rel="dns-prefetch" href="//t10.baidu.com"/>
	<link rel="dns-prefetch" href="//t11.baidu.com"/>
	<link rel="dns-prefetch" href="//t12.baidu.com"/>
	<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
    
    <title>百度一下,你就知道</title>
    

<style id="css_index" index="index" type="text/css">html,body{height:100%}
html{overflow-y:auto}
body{font:12px arial;text-align:;background:#fff}
body,p,form,ul,li{margin:0;padding:0;list-style:none}
body,form,#fm{position:relative}
td{text-align:left}
img{border:0}
a{color:#00c} 
 ........
 ........ 由於內容過多,此處省略

<script>
if(navigator.cookieEnabled){
	document.cookie="NOJS=;expires=Sat, 01 Jan 2000 00:00:00 GMT";
}
</script>

</body>
</html>
  
      上述結果與打開www.baidu.com,然後右鍵“查看源代碼”獲取得到的內容相同。

   3.抓取頁面中的鏈接頁面


      
import re
import urllib.request
import urllib

from collections import deque   #引入隊列

queue = deque()        #定義隊列,保存待處理的url
visited = set()        # 保存已抓取的url

url = 'http://www.csdn.net'  # 入口頁面, 可以換成別的

queue.append(url)     # 添加到待處理的隊列中
cnt = 0               # 已抓取數

while queue:
    url = queue.popleft()  # 獲取隊列隊首元素
    visited.add(url)  # 添加到已經訪問set中

    print('已經抓取: ' + str(cnt) + '   正在抓取 <---  ' + url)
    print('已經抓取的url:', visited)
    cnt += 1

    try:
        urlop = urllib.request.urlopen(url)      #抓取
    except:
        print('抓取: ' + url + '   異常 ')
        continue

    if 'html' not in urlop.getheader('Content-Type'):   # 判斷是否是html的url
        continue

    # 避免程序異常中止, 用try...catch處理異常
    try:
        data = urlop.read().decode('utf-8')
    except:
        continue

    # 正則表達式提取頁面中所有隊列, 並判斷是否已經訪問過, 如果沒有訪問過,則加入待抓取隊列
    linkre = re.compile('href="(.+?)"')
    for x in linkre.findall(data):
        if 'http' in x and x not in visited:
            queue.append(x)
            print('加入隊列 --->  ' + x)


輸出結果:

已經抓取: 0   正在抓取 <---  http://www.csdn.net
已經抓取的url: {'http://www.csdn.net'}
加入隊列 --->  http://c.csdnimg.cn/www/css/csdn_common.css
加入隊列 --->  http://c.csdnimg.cn/public/favicon.ico
加入隊列 --->  https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
 ...... 此處省略
加入隊列 --->  http://powerlinux.csdn 
加入隊列 --->  http://www.csdn.net/tag/jquery 
加入隊列 --->  http://www.csdn.net/company/icp.html
加入隊列 --->  http://www.csdn.net/company/pifu.html
加入隊列 --->  http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010
加入隊列 --->  http://c.csdnimg.cn/comm_ask/css/ask_float_block.css
已經抓取: 1   正在抓取 <---  http://c.csdnimg.cn/www/css/csdn_common.css
已經抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net'}
已經抓取: 2   正在抓取 <---  http://c.csdnimg.cn/public/favicon.ico
已經抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://c.csdnimg.cn/public/favicon.ico'}
已經抓取: 3   正在抓取 <---  https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
已經抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn', 'http://www.csdn.net', 'http://c.csdnimg.cn/public/favicon.ico'}
加入隊列 --->  http://edu.csdn.net/yearPromotion/detail/3
加入隊列 --->  /account/fpwd?action=forgotpassword&service=http%3A%2F%2Fmy.csdn.net%2Fmy%2Fmycsdn
加入隊列 --->  https://api.weibo.com/oauth2/authorize?client_id=2601122390&response_type=code&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DSinaWeiboProvider
加入隊列 --->  https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=75fvsy4v01jw1s&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DLinkedInProvider&state=DCEEFWF45453sdffef424
加入隊列 --->  https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=cePqkUpKCBrcnQtARTNPxxQG&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DBaiduProvider
加入隊列 --->  https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=100270989&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DQQProvider&state=test
加入隊列 --->  https://github.com/login/oauth/authorize?client_id=4bceac0b4d39cf045157&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DGitHubProvider
加入隊列 --->  /account/mobileregister?action=mobileRegisterView&service=http%3A%2F%2Fmy.csdn.net%2Fmy%2Fmycsdn
已經抓取: 4   正在抓取 <---  http://passport.csdn.net/account/mobileregister?action=mobileRegister
已經抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://passport.csdn.net/account/mobileregister?action=mobileRegister', 'http://c.csdnimg.cn/public/favicon.ico', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'}
加入隊列 --->  https://csdnimg.cn/public/common/toolbar/css/index.css
加入隊列 --->  /account/register?action=registerView&service=http://www.csdn.net
已經抓取: 5   正在抓取 <---  https://passport.csdn.net/help/faq
已經抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://passport.csdn.net/account/mobileregister?action=mobileRegister', 'http://c.csdnimg.cn/public/favicon.ico', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn', 'https://passport.csdn.net/help/faq'}
加入隊列 --->  https://passport.csdn.net/account/changepassword
加入隊列 --->  https://passport.csdn.net/account/forgotpassword
加入隊列 --->  https://passport.csdn.net/account/forgotpassword
已經抓取: 6   正在抓取 <---  http://news.csdn.net
已經抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://passport.csdn.net/account/mobileregister?action=mobileRegister', 'http://c.csdnimg.cn/public/favicon.ico', 'http://news.csdn.net', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn', 'https://passport.csdn.net/help/faq'}
加入隊列 --->  http://c.csdnimg.cn/public/common/toolbar/css/index.css




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章