爬蟲 --- 小試牛刀

爬蟲 --- 小試牛刀

1、python 鏈接測試URL

  1. 運行環境: python3.7  win7x64
  2. 使用工具: VS Code
  3. python 第三方庫: requests (自行安裝 >>> cmd --->pip install requests, 具體不作介紹)
  4. requests 庫簡介
requests 庫的網頁請求函數
函數 說明
get(url [, timeout=n]) 對應HTTP的GET方式,設定請求超時時間爲n秒
post(url, data={'key':'value'}) 對應HTTP的POST方式,字典用於傳輸客戶數據
delete(url) 對應HTTP的DELETE方式
head(url) 對應HTTP的HEAD方式
options(url) 對應HTTP的OPTIONS方式
put(url, data={'key':'value'}) 對應HTTP的PUT方式,字典用於傳輸客戶數據

其中,最經常使用的是get方法,它可以得到url的請求,並返回一個response對象做爲響應。有了響應對象,就能隨心所欲了,你以爲呢  ^x^html

response對象的屬性
屬性 說明
status_code HTTP請求的返回狀態(???諮詢一下)
encoding HTTP響應內容的編碼方式
text HTTP響應內容的字符串形式
content HTTP響應內容的二進制形式
response對象的方法
方法 說明
json() 若http響應內容中包含json格式數據, 則解析json數據
raise_for_status() 若http返回的狀態碼不是200, 則產生異常

 5. 好了,咱們開工 >>>python

① 導入庫編程

from requests import get

② 設定url, 並使用get方法請求頁面獲得響應json

url = "http://www.baidu.com"
r = get(url, timeout=3)
print("得到響應的狀態碼:", r.status_code)
print("響應內容的編碼方式:", r.encoding)

運行結果:app

得到響應的狀態碼: 200
響應內容的編碼方式: ISO-8859-1函數

 ③ 獲取網頁內容工具

url_text = r.text
print("網頁內容:", r.text)
print("網頁內容長度:", len(url_text))

運行結果:post

網頁內容: <!DOCTYPE html><!--STATUS OK--><html> <head> ... &nbsp;京ICP证030173号&nbsp; ... </body> </html>測試

網頁內容長度: 2381字體

驚不驚訝? 激不激動? 好很差玩? >>> 好吧,若是看到我上面 標藍 加粗 不明字體,你可能會 》》》問  》》》爲何?

還記得上面的編碼方式嗎?沒錯,就是他!!!

這是由於HTML代碼也有本身的編碼方式,咱們須要使用相同的編碼方式。下圖是HTML語言的編碼方式設置

知道了緣由,那就好搞了!

④ 從新獲取網頁內容

r.encoding = "utf-8"
url_text = r.text
print("網頁內容:", r.text)
print("網頁內容長度:", len(url_text))

運行結果:

網頁內容: <!DOCTYPE html> <!--STATUS OK--><html> <head> ... 意見反饋</a>&nbsp;京ICP證030173號&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

網頁內容長度: 2287

 很明顯,此次能夠了 ^v^

 

2、python 瘋狂鏈接URL

  1.  使用上述的鏈接測試 "經驗", 找個網站進行瘋狂鏈接
  2. 在此,選取搜狗網站
  3. 上代碼
url = "http://www.sogou.com" # 搜狗
for i in range(200):
    print("Test %d:" % (i+1), end=" ")
    response = get(url, timeout=5)
    # 判斷鏈接狀態
    if response.status_code == 200:
        print("Conncect successful!")
    else:
        print("Conncect UNsuccessful!")

運行結果:

Test 1: Conncect successful!
Test 2: Conncect successful!
Test 3: Conncect successful!
Test 4: Conncect successful!
Test 5: Conncect successful!

                    ................

Test 199: Conncect successful!
Test 200: Conncect successful!

結果有200行,我就不 一 一 輸出了。試一下唄,你也能夠的哦 ^_^

 

3、獲取網頁的各個屬性標籤內容

(我也不知道這個標題什麼意思, 感受很牛但看不懂, 纔怪呢!你確定看得懂!)

這裏,選取一個很厲害的網站作演示

URL = https://www.runoob.com/

 

步驟說明:

1. 找個url, 上面有了, 其實隨便一個都是OK的

2. 抓取網頁內容,這個上面有詳解,不難

3. 本次使用 BeautifulSoup 第三方庫,須要自行下載詳情介紹

4. 開工

  前面提供了 URL,如今抓取網頁內容

 1 # -*- encoding:utf-8 -*-
 2 from requests import get
 3 def getText(url):
 4     try:
 5         r = get(url, timeout=5)
 6         r.raise_for_status()
 7         r.encoding = 'utf-8'
 8         return r.text
 9     except Exception as e:
10         print("Error:", e)
11         return ''

  而後再引入 beautifulsoup庫,不過與其餘的庫有點不同,別寫錯了喲

from bs4 import BeautifulSoup

  以後建立一個 beautifulsoup  對象

1 url = "https://www.runoob.com/"
2 html = getText(url)
3 soup = BeautifulSoup(html)

  好了,如今想要幹嗎就幹嗎 ↓↓↓

① 獲取 head 標籤

print("head:", soup.head)
print("head:", len(soup.head))

    因爲結果比較多,就只輸出第二個結果

head: 33

② 獲取 body 標籤

print("body:", soup.body)
print("body:", len(soup.body))

  因爲結果比較多,就只輸出第二個結果

body: 39

③ 獲取 title 標籤

print("title:", soup.title)

title: <title>菜鳥教程 - 學的不只是技術,更是夢想!</title>

④ 獲取 title 的內容

print("title_string:", soup.title.string)

title_string: 菜鳥教程 - 學的不只是技術,更是夢想!

⑤ 查找特定 id 的內容

print("special_id:", soup.find(id='cd-login'))

special_id: <div id="cd-login"> <!-- 登陸表單 -->
<div class="cd-form">
<p class="fieldset"> ......

⑥ 查找全部的 a 標籤

a: [<a href="/">菜鳥教程 -- 學的不只是技術,更是夢想!</a>, <a class="current" data-id="index" href="//www.runoob.com/" title="菜鳥教程">首頁</a>, ......

⑦ 摘取全部的中文字符

1 import re
2 def getChinese(text):
3     text_unicode = text.strip() # 將字符串進行處理, 包括轉化爲unicode
4     string = re.compile('[^\u4e00-\u9fff]')
5         # 中文編碼範圍是 \u4e00-\u9ffff
6         # 中文、數字編碼範圍是 \u4e00-\u9fa50
7     chinese = "".join(string.split(text_unicode))
8     return chinese
print("Chinese:", getChinese(html))

Chinese: 菜鳥教程學的不只是技術更是夢想菜鳥教程提供了編程的基礎技術教程 ......

 

4、爬取中國大學排名

 此處就不細講,直接上代碼

 1 # -*- coding: utf-8 -*-
 2 '''
 3 獲取中國大學的排名
 4 @author: bpf
 5 '''
 6 import requests
 7 from bs4 import BeautifulSoup
 8 import pandas
 9 # 1. 獲取網頁內容
10 def getHTMLText(url):
11     try:
12         r = requests.get(url, timeout = 30)
13         r.raise_for_status()
14         r.encoding = 'utf-8'
15         return r.text
16     except Exception as e:
17         print("Error:", e)
18         return ""
19 
20 # 2. 分析網頁內容並提取有用數據
21 def fillTabelList(soup): # 獲取表格的數據
22     tabel_list = []      # 存儲整個表格數據
23     Tr = soup.find_all('tr')
24     for tr in Tr:
25         Td = tr.find_all('td')
26         if len(Td) == 0:
27             continue
28         tr_list = [] # 存儲一行的數據
29         for td in Td:
30             tr_list.append(td.string)
31         tabel_list.append(tr_list)
32     return tabel_list
33 
34 # 3. 可視化展現數據
35 def PrintTableList(tabel_list, num):
36     # 輸出前num行數據
37     print("{1:^2}{2:{0}^10}{3:{0}^5}{4:{0}^5}{5:{0}^8}".format(chr(12288), "排名", "學校名稱", "省市", "總分", "生涯質量"))
38     for i in range(num):
39         text = tabel_list[i]
40         print("{1:{0}^2}{2:{0}^10}{3:{0}^5}{4:{0}^8}{5:{0}^10}".format(chr(12288), *text))
41 
42 # 4. 將數據存儲爲csv文件
43 def saveAsCsv(filename, tabel_list):
44     FormData = pandas.DataFrame(tabel_list)
45     FormData.columns = ["排名", "學校名稱", "省市", "總分", "生涯質量", "培養結果", "科研規模", "科研質量", "頂尖成果", "頂尖人才", "科技服務", "產學研合做", "成果轉化"]
46     FormData.to_csv(filename, encoding='utf-8', index=False)
47 
48 if __name__ == "__main__":
49     url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
50     html = getHTMLText(url)
51     soup = BeautifulSoup(html, features="html.parser")
52     data = fillTabelList(soup)
53     #print(data)
54     PrintTableList(data, 10)   # 輸出前10行數據
55     saveAsCsv("D:\\University_Rank.csv", data)

 運行結果:

相關文章
相關標籤/搜索