爬蟲中接觸或者使用過那些數據解析的方式?html
- 正則 - bs4(只能在python中使用) - xpath - pyquery(瞭解,自學)
解析原理:python
標籤的定位(從請求到的頁面中找到須要的數據的標籤)
提取數據(從標籤中獲取到須要的數據)
bs4解析url
解析原理: 實例化一個BeautifulSoup對象,而且將即將被解析的源碼數據對象加載到該對象中 調用BeautifulSoup對象中相關的屬性和方法進行標籤訂位和數據的提取 環境的安裝: pip install bs4 pip install lxml BeautifulSoup對象的實例化 #將本地的html文檔中的源碼數據加載到該對象中,fp是本地文件 soup=BeautifulSoup(fp,'lxml') #將從互聯網中獲取到的數據加載到該對象中,page_text是從網上獲取到的數據 BeautifulSoup(page_text,'lxml')
用法spa
from bs4 import BeautifulSoup
#從本地獲取數據
fp=open('./a.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
#從網頁中獲取的數據
page_text=requests.get(url=url,headers=headers).text
soup=BeautifulSoup(page_text,'lxml')
#標籤訂位
soup.TagName #獲取到網頁中第一次出現的標籤
soup.find('tagName',attrName='屬性名') #經過屬性名定位到標籤,也是隻能拿到一條數據
soup.find_all('tagName',attrName='屬性名') #也是經過屬性定位,可是能拿到全部的數據
soup.select('選擇器')
soup.select('#fei')
soup.select('.fei > ul > li') # > 是隻能一層一層的找, 空格是能夠多層找
#數據提取
提取文本信息內容
soup.p.string #獲取的是標籤中直系的文本內容
soup.p.text #獲取的是標籤中全部的文本內容
soup.p.get_text() #和text效果差很少
提取屬性值
soup.img['標籤名']
實例.net
#爬取三國演義小說全篇內容 from bs4 import BeautifulSoup import requests url = 'http://www.shicimingju.com/book/sanguoyanyi.html' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' } page_text = requests.get(url=url,headers=headers).text #數據解析:章節標題 soup = BeautifulSoup(page_text,'lxml') a_list = soup.select('.book-mulu > ul > li > a') fp = open('./sanguo.txt','w',encoding='utf-8') for a in a_list: title = a.string detail_url = 'http://www.shicimingju.com'+a['href'] #獲取詳情頁的源碼數據 detail_page_text = requests.get(url=detail_url,headers=headers).text soup = BeautifulSoup(detail_page_text,'lxml') content = soup.find('div',class_="chapter_content").text fp.write(title+':'+content+'\n') print(title,'下載完畢!') fp.close()
xpath解析3d
解析原理:
實例化一個etree對象,並將頁面源碼數據加載到該對象中
能夠經過etree對象中的xpath方法接個不一樣類型的xpath表達式進行標籤訂位和數據提取
環境安裝:
pip install lxml
#etree對象的實例化
tree=etree.parse(filepath) #讀取本地文件,將本地文件傳入對象中
tree=etree.HTML(page_text) #將互聯網中的源代碼傳入對象
用法:code
from lxml import etree tree=etree.parse('./test.html') page_text=requests.get(url=url,headers=headers).text tree=etree.HTML(page_text) tree.xpath('/html/head/title') # 用'/'必須是從根節點開始找 tree.xpath('//head/title') #'//'不是從根節點開始尋找 #屬性定位 tree.xpath('//div[@class="tang"]/li[2]')#經過索引定位,這裏的索引是從1開始的 #數據提取
#提取文本內容 tree.xpath('//div/a[1]/text()') #/text()取出直系文本內容 tree.xpath('//div/a[1]//text()') # //text()取出的是a標籤下的全部文本內容 #提取屬性內容 tree.xpath('div[2]/@href') #直接@屬性名
實例:orm
#爬取boss中崗位的名稱,薪資,公司名稱 url = 'https://www.zhipin.com/job_detail/?query=python%E7%88%AC%E8%99%AB&city=101010100&industry=&position=' page_text = requests.get(url=url,headers=headers).text #數據解析 tree = etree.HTML(page_text) li_list = tree.xpath('//div[@class="job-list"]/ul/li') for li in li_list: job_title = li.xpath('.//div[@class="job-title"]/text()')[0] salary = li.xpath('.//div[@class="info-primary"]/h3/a/span/text()')[0] company = li.xpath('.//div[@class="company-text"]/h3/a/text()')[0] print(job_title,salary,company)
分頁處理:xml
#需求:爬取http://pic.netbian.com/4kmeinv/ 全部的圖片數據 分頁處理 url = 'http://pic.netbian.com/4kmeinv/index_%d.html' for page in range(1,6): if page == 1: new_url = 'http://pic.netbian.com/4kmeinv/' else: new_url = format(url%page) response = requests.get(url=new_url,headers=headers) # response.encoding = 'utf-8' page_text = response.text
......
懶加載: htm
咱們在查看網頁源碼的時候發現,這裏圖片的有一個src屬性儲存的是圖片地址,這是咱們在網頁的可視化界面中看到的,如圖下:
可是咱們發現,圖片不在咱們可視化範圍內的圖片的src屬性名變成了src2屬性名,如圖下:
咱們在進行爬蟲數據分析獲取標籤屬性值的時候,咱們的爬蟲程序時不會進入到可視化界面中的,因此若是用src屬性找的話,是獲取不到的,所以在這裏咱們獲取屬性值的時候,只須要獲取src2就能夠了.
實例: (圖片懶加載怎麼解決)
#站長素材中圖片下載應用了圖片懶加載的技術 url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #獲取頁面文本數據 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析頁面數據(獲取頁面中的圖片連接) #建立etree對象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析獲取圖片地址和圖片的名稱 for div in div_list: image_url = div.xpath('.//img/@src2') #src2僞屬性 image_name = div.xpath('.//img/@alt')