Web請求程序
1、服務器渲染:在服務器那邊直接把資料和html整合在一起,統一回傳給瀏覽器
在頁面源代碼中能看到資料
2、客戶端渲染:第一次請求只有一個html骨架,第二次請求拿到資料,進行資料展示(一般為XHR)
在頁面源代碼中看不到資料
<可用檢查網頁或者F12來查看>
HTTP協議
Hyper Text Transfer Protocol:超文本傳輸協議,從萬維網(www:World Wide Web)服務器傳輸超文本到本地瀏覽器的傳送協議
HTML(Hyper Text Makeup Language):超文本標記語言
HTTP對于請求和相應都把訊息分為三個部分:( {}中表示在實際網頁中的形式)
請求:
1、請求行:請求方式(get/post)、請求url地址、協議
{Request URL(在?前的是URL,在?后的是引數)、Request Method}
GET:一般用于查詢東西(顯式提交),請求方式一般是Query String Parameters(即在Request URL中?后的內容)
POST:一般用于修改東西(隱式提交),請求方式一般是Form Data
2、請求頭:放一些服務器要求的附加資訊(比如對資料的要求)
{Request Heads}(User-Agent(請求載體的身份標識)、Referer(防盜鏈)、Cookie(用戶的登錄狀態))
3、請求體:放一些請求引數(比如搜索的內容)
相應:
1、狀態行:協議、狀態碼(告訴我請求是否成功,比如200、404、500、302)
{Status code}
2、回應頭:放一些客戶端要求的附加資訊(比如密鑰)
{Response Heads}(Cookie、各種莫名其妙的字串(一般都是token字樣))
3、回應體:服務器回傳的真正的客戶端要用的內容(HTML、json)
一、re
import requests import re url = "https://movie.douban.com/top250" headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"} # 請求頭 response = requests.get(url, headers=headers) text = response.text obj = re.compile(r"""<li>.*?<span >(?P<name>.*?)</span>.*?<p >(?P<director>.*?) (?P<lead>.*?)...<br>(?P<time>.*?) / (?P<country>.*?) / (?P<type>.*?)\s\s\s.*?<span property="v:average">(?P<score>.*?)</span>.*?<span>(?P<number>.*?)</span>.*?<span >(?P<quote>.*?)</span>""", re.S) result = obj.finditer(text) # 在text中查找obj(是一個Pattern物件),回傳一個迭代器 for i in result: print(i.group("name")) # group()用于分組 print(i.group("director").strip()) # 去掉空格 print(i.group("lead")) print(i.group("time").strip()) print(i.group("country")) print(i.group("type")) print(i.group("score")) print(i.group("number")) print(i.group("quote")) response.close()
結果為:
肖申克的救贖 導演: 弗蘭克·德拉邦特 Frank Darabont 主演: 蒂姆·羅賓斯 Tim Robbins / 1994 美國 犯罪 劇情 9.7 2613829人評價 希望讓人自由, 霸王別姬 導演: 陳凱歌 Kaige Chen 主演: 張國榮 Leslie Cheung / 張豐毅 Fengyi Zha 1993 中國大陸 中國香港 劇情 愛情 同性 9.6 1940678人評價 風華絕代, ……
詳細介紹請看python正則運算式
二、BeautifulSoup
import requests from bs4 import BeautifulSoup url = "http://zhongdapeng.com/shucaijiage/831.html" response = requests.get(url) response.encoding = "utf-8" text = response.text # 先把頁面源代碼交給BeautifulSoup處理,生成bs物件 page = BeautifulSoup(text, "html.parser") # 指定為html決議器(parser) # 再從bs物件中查找資料:1、find(只找一個) 2、find_all 這兩者后面都是(標簽,屬性=值),注意屬性可能為python的關鍵字,比如class,那么就要寫成class_=值或者attrs={"class":值} table = page.find("table", attrs={"cellspacing": "0"}) trs = table.find_all("tr")[1:] # 去掉第0個 for tr in trs: tds = tr.find_all("td") print(tds[1].text, tds[2].text, tds[4].text, tds[5].text) # .text表示被標簽標記的內容 response.close()
結果為:
意大利 1.6-1.8 香菜 5.0-6.0 油麥菜 1.7-1.7 菠菜 3.0-3.5 上青 0.3-0.4 茼蒿 1.3-1.5 ……
三、xpath
import requests from lxml import etree url = "https://search.jd.com/Search?keyword=iphone&enc=utf-8&wq=iphone&pvid=eb21f8da6aad40ccb455dd20c5ce52d4" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"} # 請求頭 response = requests.get(url, headers=headers) response.encoding = "utf-8" text = response.text treeoject = etree.HTML(text) # 決議html # 根據xpath來提取元素 lis = treeoject.xpath("""/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li""") for li in lis: # /text()獲取標簽內的文本 price = li.xpath("""./div/div[3]/strong/i/text()""")[0] description = "iPhone".join(li.xpath("""./div/div[4]/a/em/text()""")).strip() # 去掉空格 merchandiser = li.xpath("""./div/div[7]/span/a/text()""")[0] print(price) print(description) print(merchandiser) print("") # 可以用屬性值索引:li[@class='…']/… # //li代表匹配所有的后代li節點,不論幾代 # ./代表從相對目錄開始查找 # *代表通配符 # @用來提取屬性值:li/@class response.close()
結果為:
6098.00 Apple iPhone 13 (A2634) 128GB 星光色 支持移動聯通電信5G 雙卡雙待手機【快充套裝】 Apple產品京東自營旗艦店 3999.00 Apple iPhone 11 (A2223) 128GB 黑色 移動聯通電信4G手機 雙卡雙待 Apple產品京東自營旗艦店 5499.00 Apple iPhone 13 128GB 午夜色 支持移動聯通電信5G 雙卡雙待手機 廣州電信京東自營旗艦店 ……
# Web請求程序
"""
1、服務器渲染:在服務器那邊直接把資料和html整合在一起,統一回傳給瀏覽器
在頁面源代碼中能看到資料
2、客戶端渲染:第一次請求只有一個html骨架,第二次請求拿到資料,進行資料展示(一般為XHR)
在頁面源代碼中看不到資料
<可用檢查網頁或者F12來查看>
"""
# HTTP協議
"""
Hyper Text Transfer Protocol:超文本傳輸協議,從萬維網(www:World Wide Web)服務器傳輸超文本到本地瀏覽器的傳送協議
HTML(Hyper Text Makeup Language):超文本標記語言
HTTP對于請求和相應都把訊息分為三個部分: # {}中表示在實際網頁中的形式
請求:
1、請求行:請求方式(get/post)、請求url地址、協議
{Request URL(在?前的是URL,在?后的是引數)、Request Method}
GET:一般用于查詢東西(顯式提交),請求方式一般是Query String Parameters(即在Request URL中?后的內容)
POST:一般用于修改東西(隱式提交),請求方式一般是Form Data
2、請求頭:放一些服務器要求的附加資訊(比如對資料的要求)
{Request Heads}(User-Agent(請求載體的身份標識)、Referer(防盜鏈)、Cookie(用戶的登錄狀態))
3、請求體:放一些請求引數(比如搜索的內容)
相應:
1、狀態行:協議、狀態碼(告訴我請求是否成功,比如200、404、500、302)
{Status code}
2、回應頭:放一些客戶端要求的附加資訊(比如密鑰)
{Response Heads}(Cookie、各種莫名其妙的字串(一般都是token字樣))
3、回應體:服務器回傳的真正的客戶端要用的內容(HTML、json)
"""
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471765.html
標籤:Python
上一篇:【爬蟲+情感判定+Top10高頻詞+詞云圖】"烏克蘭"油管熱評python輿情分析
下一篇:Python關鍵字(保留字)
