Python之網絡爬蟲(XML與HTML與JSON文件、urllib與request的用法)

一、數據的類型

1、結構化數據
可以用統一的結構加以表示的數據。可以使用關係型數據庫表示和存儲,表現爲二維形式的數據。特點是:數據以行爲單位,一行數據表示一個實體的信息,每一行數據的屬性是相同的。比如MySQL數據表中是數據。

2、半結構化數據
是結構化數據的一種形式,並不符合關係型數據庫或其他數據表的形式關聯起來的數據模型結構,但包含相關標記,用來分隔語義元素以及對記錄和字段進行分層。因此,它也被稱爲自描述的結構。常見的半結構數據有HTML,XML和JSON等,實際上是以樹或者圖的結構來存儲的。

3、非結構化數據
就是沒有固定結構的數據,各種文檔、圖片、視頻/音頻等都屬於非結構化數據。對於這類數據,我們一般直接整體進行存儲,而且一般存儲爲二進制的數據格式。除了結構化和半結構數據之外的數據都是非結構化數據。

4、總結
簡單來說,結構化數據要求嚴格,數據類型和大小都是提前規定好了的;而半結構化數據沒有那麼嚴格,可以適當擴充;非結構化數據,可以任意修改。

二、HTML與XML的區別

  • 1、在HTML中不區分大惲,在XML中嚴格區分。
  • 2.在HTML中,有時不嚴格,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你可以省略或者之類的結束標記。在XML中,是嚴格的樹狀結構,絕對不能省略掉結束標記。
  • 3、在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個/字符作爲結尾。這樣分析器就知道不用查找結束標記了。
  • 4、在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。
  • 5、在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應的值。
  • 6、HTML使用固有的標記;而XML沒有固有的標記;HTML標籤是預定義的:XML標籤是免費的、自定義的、可擴展的。
  • 7、HTML是用來顯示數據並將內容與數據結合的,偏重前端;而XML是用來描述數據、存放數據的。HTML的設計目標是現實數據並集中與數據外觀,而XML的設計目標是描述數據並集中與數據的內容。

總的來說就是,XML的語法要求比HTML的要嚴格;但他們的作用和設計目標不同,因此各有好處,就看我們是否用得恰當。

三、json文件

1、json文件的認識
JSON(JavaScript Object Notation, JS對象標記)是一種輕量級的數據交換格式。它基於ECMAScript (w3c制定的JS規範)的一個子集,採用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得JSON成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成,銪效地提升網絡傳輸效率。

2、JSON的語法規則
在JS語言中,一切都是對象。因此,任何支持的類型都可以通過JSON來表
示,例如字符串、數字、對象、數組等。但是對象和數組是比較特殊且常用的兩種類型。

  • 對象表示爲鍵值對。
  • 數據由逗號分隔。
  • 花括號保存對象。
  • 方括號保存數組。

3、JSON與JS對象的關係
實際上可以這麼理解, JSON是JS對象的字符串表示法,它使用文本表示一個JS對象的信息,本質是一個字符串。

四、提取網頁中的信息

1、XPath與Ixml的關係
XPath是一門在XML、HTML文檔中查找信息的語言,對XPath的理解是很多高級XML、HTML應用的基礎,XPath 在XML中通過元素和屬性進行導航。Ixml是一個用來處理XMLr的第三方Python庫,它在底層封裝了用C語言編寫的libxm12 和libxslt,並以簡單強大的Python API, 兼容並加強了著名的Element TreeAPI。
安裝: pip install Ixml
使用: from lxml import etree

# from xml.etree import ElementTree
# 或者這樣導入
from xml.etree import cElementTree

# 一個xml字符串
xmlStr = """<bookstore>
<book>
    <title lang="en">Python爬蟲</title>
    <author>Za·huw</author>
    <year>2020</year>
    <price>99,79</price>
</book>
<book>
    <title lang="en">Python數據分析</title>
    <author>Zo·ro</author>
    <year>2018</year>
    <price>49.9</price>
</book>
</bookstore>
"""

# 根節點
root = cElementTree.fromstring(xmlStr)
# print(root)

# 查找某一個節點
elements = root.find("book/title")
print(elements)

# 關於xpath語法其實並不好用,在我們需要xpath路徑的時候我們完全可以藉助瀏覽器來獲取
# 找到對應的元素,右擊檢查,定位到需要鏈接那裏,右擊,Copy,有一個Copy Xpath,這就是我們需要的


2、Beautiful Soup的使用
Beautiful Soup是用Python寫的一個HTML/XML的解析器,它可以很好的處理不規範標記並生成剖析樹(parse tree)。它提 供簡單又常用的導航(navigating) ,搜索以及修改剖析樹的操作。它可以大大節省你的編程時間。
安裝: pip install beautifuilsoup4。

# BeautifulSoup:相對於xpath而言,可讀性好,可維護性好
# 缺點是:慢
from bs4 import BeautifulSoup
doc = ['<html><head><title>Hello</title></head>',
       '<body><pid="firstpara" align="center">Hello world!></body></html>']
soup = BeautifulSoup(''.join(doc),"html")
print(soup.prettify())
print(type(soup.contents[0]))
# BeautifulSoup最好用的方法:找p標籤的align屬性
soup.findAll('p',align="center")

五、爬蟲的實現

1、urllib來實現

from urllib import request
# 獲取新浪首頁的網頁源代碼
print(request.urlopen(request.Request("http://www.sina.com.cn")).read().decode())

2、request來實現

import requests
res = requests.get("http://www.sina.com.cn")
res.decoding = "utf-8"
print(res.text)

3、修改headers請求頭信息

from urllib import request
# 修改請求頭headers信息:用自己的瀏覽器,按F12查看數據,點Network,
# 隨便找個數據包,找到Headers下的User-Agent,複製該鍵值對
# 即將自己訪問該網站時的身份標識爲一個瀏覽器,因爲該身份瀏覽器是無法檢測出是否正確的(一個爬蟲可以利用的漏洞)
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"}
request.urlopen(request.Request("http://www.sina.com.cn/",headers=headers)).read().decode('utf-8')

4、正則匹配複習

# 正則匹配
# 取出i=d%0A&from=AUTO&to=AUTO&%smartresult=dict&的key和value(()分組的方法)
import re
rec = "i=d%0A&from=AUTO&to=AUTO&%smartresult=dict&"
pi = "(.*?)=(.*?)&"
vv = re.findall(pi,rec)
print(vv)

5、url encode編碼
實例:輸入關鍵詞,獲取百度搜索網頁


import urllib
from urllib import request

# 變量設定
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"}
url = "https://www.baidu.com/s?"
keyword = input("請輸入你要查詢的信息:")
wd = {"wd":keyword}  # 保存臨時鍵值對

# 完成一次get請求
wd = urllib.parse.urlencode(wd)  # 將get請求進行url encode編碼
fullUrl = url + wd  # 拼接搜索頁的鏈接:原url + 對get請求的url編碼
print(fullUrl)  # 輸出搜索頁鏈接

# 獲取整個網頁文件:獲取網頁源代碼 + 寫入文件
req = request.Request(fullUrl,headers=headers)
response = request.urlopen(req)
with open("baiduSearch.html","wb") as f:  # 響應信息就是字節類型的,因此不需要解碼
    f.write(response.read())
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章