爬蟲第二章 bs4 xpath 圖片懶加載 分頁處理

爬蟲中接觸或者使用過那些數據解析的方式?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')
相關文章
相關標籤/搜索