Datawhale第十二期組隊學習--Python爬蟲編程實踐 Task01:html等有關知識,api使用,request-get使用

學習參考鏈接

一. 互聯網 HTTP

互聯網

  1. 互聯網也叫因特網(Internet),是指網絡與網絡所串聯成的龐大網絡,這些網絡以一組標準的網絡協議族相連,連接全世界幾十億個設備,形成邏輯上的單一巨大國際網絡。
  2. 互聯網並不等於萬維網(WWW),萬維網只是一個超文本相互鏈接而成的全球性系統,而且是互聯網所能提供的服務之一。

HTTP

  1. HTTP是一個客戶端(用戶)和服務器端(網站)之間進行請求和應答的標準。
  2. 通常由HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP鏈接。HTTP服務器則在該端口監聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態(比如“THTTP/1.1 200 OK”),以及請求的文件、錯誤信息等響應內容。
  3. HTTP的請求方法有很多種,主要包括以下幾個:
  • GET:向指定的資源發出“顯示”請求。GET方法應該只用於讀取數據,而不應當被用於“副作用”的操作中(例如在Web Application中)。其中一個原因是GET可能會被網絡蜘蛛等隨意訪問。
  • HEAD:與GET方法一樣,都是向服務器發出直頂資源的請求,只不過服務器將不會出傳回資源的內容部分。它的好處在於,使用這個方法可以在不必傳輸內容的情況下,將獲取到其中“關於該資源的信息”(元信息或元數據)。
  • POST:向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求文本中。這個請求可能會創建新的資源或修改現有資源,或二者皆有。
  • PUT:向指定資源位置上傳輸最新內容。
  • DELETE:請求服務器刪除Request-URL所標識的資源,或二者皆有。
  • TRACE:回顯服務器收到的請求,主要用於測試或診斷。
  • OPTIONS:這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用“*”來代表資源名稱向Web服務器發送OPTIONS請求,可以測試服務器共能是否正常。
  • CONNECT:HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器。通常用於SSL加密服務器的連接(經由非加密的HTTP代理服務器)。方法名稱是區分大小寫的。當某個請求所針對的資源不支持對應的請求方法的時候,服務器應當返回狀態碼405(Method Not Allowed),當服務器不認識或者不支持對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。

二. 網頁基礎

網頁組成

網頁是由 HTML 、 CSS 、JavaScript 組成的。

網頁結構

  1. 在 HTML 中,所有標籤定義的內容都是節點,它們構成了一個 HTML DOM 樹。
  2. 根據 W3C 的 HTML DOM 標準,HTML 文檔中的所有內容都是節點:
  • 整個文檔是一個文檔節點
  • 每個 HTML 元素是元素節點
  • HTML 元素內的文本是文本節點
  • 每個 HTML 屬性是屬性節點
  • 註釋是註釋節點

HTML DOM 將 HTML 文檔視作樹結構。這種結構被稱爲節點樹:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o5Cb5wVK-1587455612179)(在這裏插入圖片描述])
節點關係

使用開發者工具檢查網頁

Chrome的開發者模式爲用戶提供了下面幾組工具。

  • Elements:允許用戶從瀏覽器的角度來觀察網頁,用戶可以藉此看到Chrome渲染頁面所需要的HTML、CSS和DOM(Document Object Model)對象。

  • Network:可以看到網頁向服務氣請求了哪些資源、資源的大小以及加載資源的相關信息。此外,還可以查看HTTP的請求頭、返回內容等。

  • Source:即源代碼面板,主要用來調試JavaScript。

  • Console:即控制檯面板,可以顯示各種警告與錯誤信息。在開發期間,可以使用控制檯面板記錄診斷信息,或者使用它作爲shell在頁面上與JavaScript交互。

  • Performance:使用這個模塊可以記錄和查看網站生命週期內發生的各種事情來提高頁面運行時的性能。

  • Memory:這個面板可以提供比Performance更多的信息,比如跟蹤內存泄漏。

  • Application:檢查加載的所有資源。

  • Security:即安全面板,可以用來處理證書問題等。

三. requests

requests.get 讀取python之禪
requests.post翻譯python之禪

# coding:utf-8

import requests


# 爬取python之禪
def craw():
    url = 'https://www.python.org/dev/peps/pep-0020/'
    res = requests.get(url)
    text = res.text
    # print(text)
    with open('zen_of_python.txt', 'w') as f:
        # 官方
        f.write(text[text.find('<pre')+28:text.find('</pre>')-1])
        # 使用xpath或者re
        # path = '<pre class="literal-block">(.*?)</pre>'
        # f.write(re.compile(path).findall(text))
    print(text.find('<pre')+28, text.find('</pre>')-1)


# 翻譯zen of python
def translate(word):
    url = 'http://fy.iciba.com/ajax.php?a=fy'
    data = {'f': 'auto', 't': 'auto', 'w': word}
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
    response = requests.post(url, data=data, headers=headers)
    return response.json()


# 獲取翻譯結果
def run(word):
    return translate(word)['content']['out']


def main():
    craw()
    with open('zen_of_python.txt', 'r') as f:
        result = [run(word) for word in f]
    with open('zen_of_python_zh_CN.txt', 'w') as f:
        for i in result:
            f.write(i + '\n')


if __name__ == '__main__':
    main()

request.get進階:爬取豆瓣電影

# coding:utf-8

import requests
from lxml import etree


# 獲取豆瓣top250所有頁的url
def get_urls():
    base_url = 'https://movie.douban.com/top250?start='
    urls = []
    for i in range(0, 251, 25):
        urls.append(base_url+str(i))
    return urls


# 讀取html
def read_url_text(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    return response.text


# 解析html獲取數據
def parse_html(text):
    page_data = []
    html = etree.HTML(text)
    lis = html.xpath('//ol[@class="grid_view"]/li')
    for i, ele in enumerate(lis):
        rank = ele.xpath('//div[@class="item"]//div[@class="pic"]//em/text()')[i]
        pic_path = ele.xpath('//div[@class="item"]//div[@class="pic"]//a/img/@src')[i]
        film_name = ele.xpath('//div[@class="item"]//div[@class="info"]//div[@class="hd"]/a/span[1]/text()')[i]
        page_data.append((rank, film_name, pic_path))
    return page_data


def main():
    urls = get_urls()
    result = []
    for url in urls:
        text = read_url_text(url)
        result.extend(parse_html(text))
    with open('db_top250.txt', 'w') as f:
        for i in result:
            f.write(str(i) + '\n')


if __name__ == '__main__':
    main()

四. JavaScript與AJAX技術

JavaScript語言的特點
  • 動態語言
    動態語言是指程序在運行時可以改變其結構:新的函數可以被引進,已有的函數可以被刪除等在結構上的變化。JavaScript便是一個動態語言。除此之外如Ruby、Python等也都屬於動態語言,而C、C++等語言則不屬於動態語言。比如在JavaScript中可以在對象定義之後動態的爲其添加屬性和方法

  • 腳本語言
    腳本語言是爲了縮短傳統的編寫-編譯-鏈接-運行(edit-compile-link-run)過程而創建的計算機編程語言,只在被調用時進行解釋或編譯,然後執行。它的命名起源於一個腳本“screenplay”,每次運行都會使對話框逐字重複。早期的腳本語言經常被稱爲批量處理語言或工作控制語言。

  • 弱類型

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