4-Gin路由基礎
編碼流程:
--指定url
--發起請求
--獲取響應資料
--資料解析
--持久化儲存
資料解析的原理概述:
解析的區域性的文字內容都會在標籤之間或者標籤對應的屬性中進行儲存
1、進行指定的標籤的定位
2、標籤或者標籤對應的屬性中儲存的資料值進行提取(解析)
資料解析分類:
re解析
bs4解析
xpath解析
import requests
import re
url = 'http://www.baidu.com'
header = {
'User-Agent' : ' '
}
data_text = requests.get( url=url,headers= hedader).text
ex = '<div>.*?</div>'
l1 = re.findall( ex , data_text , re.S )
for img in l1:
data_src =img.split( '//' )[ -1 ]
url = 'http://' + data_src
name = data_+src[ -8: ]
data = request.get( url=url , headers=header ).content
with open( name , 'wb' ) as obj:
obj.write( data )
bs4進行資料解析
資料解析原理:
1、標籤定位
2、提取標籤、標籤屬性中儲存的資料值
bs4資料解析原理:
1、例項化一個beautifulSoup物件,並且將頁面的原始碼資料記載到該物件中
2、通過呼叫beautifulSoup物件中相關的屬性或者方法進行對標籤定位和資料提取
環境安裝
-pip install bs4
-pip install lxml
如何例項化BeautifulSoup物件:
--from bs4 import BeautifulSoup
--物件的例項化
--1、將本地的html文件中的資料載入到該物件中
fp = open( './test.html ' , ' r ' , enconding=' utf-8 ')
soup = BeautifulSoup( fp , ' lxml ' )
--2、將網際網路上獲取的頁面資源載入到該物件中
page_text = response.text
soup = BeautifulSoup( page_text , ' lxml ' )
--提供的用於資料解析的方法和屬性:
-soup.tagName:返回的是文件中第一次出現的tagName對應的標籤
-soup.find( ):
find( 'tagName' ):等同於soup.div
屬性定位:
--soup.find( 'div',class/id/attr = 'song' )
-soup.findall( 'tagName' ):返回符合要求的所有標籤
--select
--select( '某種選擇器(id,class,標籤...選擇器)'),返回的是一個列表
--層級選擇器
--soup.select( ' .tang > ul > li >a ' ):表示的是一個層級
--soup.select( '.tang >ul a ' ):空格表示的多個層級
--獲取標籤之間的文字資料:
--soup.a.text / string / get_text( )
--text / get_text( ) :可以獲取某一個標籤的文字內容
--string:只可以獲取該標籤下面的直系的文字內容
--獲取標籤中屬性值:
-soup.a[ 'href' ]
bs4來進行解析
import requests
from bs4 import BeautfulSoup
url = 'http://www.baidu.com'
header = {
' user-agent ' : ' '
}
page = requests.get( url=url , headers=header )
page.encoding = 'utf-8'
soup = BeautifulSoup( data.text, 'lxml')
a_list = soup.select( ' .tang > ul > li >a ' )
for iteam in a_list:
title_name = iteam.string
url2 = ' http:// ' + iteam[ ' href ' ]
data = requests.get( url=url2 , headers=header ).text
soup = BeautifulSoup( data, 'lxml' )
data_text = soup.find( ' div ' , class_=' tong ' )
with open( './new.txt' , 'w' , encoding='utf-8' ) as file:
file.write( data_text )
xpath解析: 最常用且最便捷高效的一種解析方式
xpath解析原理:
-1、例項化一個etree的物件,且需要將被解析的網頁原始碼資料載入到該物件中
-2、調傭etree物件中的xpath方法結合著xpath表示式實現標籤的定位和內容的捕獲
環境的安裝:
pip install lxml
如何例項化一個etree物件:
-1、將本地的html文件中的原始碼資料載入到etree物件中
etree.parse( filepath )
-2、可以將網頁上獲取的原始碼載入到該物件中
etree.HTML( 'page_text' )
- xpath( 'xpath表示式' )
- /:表示的從根節點開始定位。表示的是一個 層級
- //:表示的是多個層級。可以表示從任意位置開始定位
- 屬性定位://div[ @class='song'] tag[ @attrName='attrValue' ]
- 索引定位:/div[ @class='song'] /p[ 3 ]
- 取文字:
-/ text( ) 獲取的是標籤中直系的文字內容
-// text( ) 標籤中非直系的文字內容 (所有文字內容)
- 取屬性:
-/@attrName ==>img/src
xpath來進行解析
import requests
from lxml import etree
url='https://www.nipic.com/topic/show_27437_1.html'
headers = {
'User-Agent' : ' '
}
page = requests.get( url=url,headers=header).text
tree = etree.parse(page)
li_list = tree.xpath( ''//div[@class=" "]/ul/li'' )
for li in li_list:
img_href = li.xpath('./a/@href')[0]
url = 'https://www.nipic.com/' + img_href
# print(url)
img_src = li.xpath('./a/img/@src')[0]
# print(img_src)
img_name = img_href.split('/')[-1]
# print(img_name)
img_page = requests.get(url=url,headers=header).text
tree = etree.HTML(img_page)
img_down_src = tree.xpath('//div[@id="static"]/img/@src')[0]
# print(img_down_src)
img_url = 'http:' + img_down_src
# print(img_url)
img_data = requests.get(url=img_url,headers=header).content
path = './imga2/' + img_name + '.jpg'
with open(path,'wb') as file:
file.write(img_data)
print(img_name + '下載完成!!!')