xml是一種標記語法的文本格式,xpath可以方便的定位xml中的元素和其中的屬性值。html也屬于標記語言,可以用xpath來獲取想要的對象和屬性。
lxml是python中的一個包,這個包中包含了將html文本轉成xml對象,和對對象執行xpath的功能。
以下是xpath的常用路徑選擇語法:
- 節點名 選取此節點下的所有子節點
- / 從根節點選取
- // 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
- @ 選取屬性
以下是一個練習,爬取,貼吧的圖片:
思路:
1. 根據url變化寫出,列表頁的url表達式
2. 訪問列表頁,通過xpah獲取每條內容的鏈接
3. 通過連接進入詳情頁,獲取其中的圖片鏈接
4. 通過圖片src 訪問圖片,并保存在本地
這里講一個大坑
從瀏覽器中通過xpath,能匹配到

enter description here
但是在代碼中運行卻不能,
經過一番折騰終于發現了,查看response文本,
竟然發現body部分被注釋掉了,那么取消掉注釋就可以匹配到了。
# coding=utf8
import urllib
import urllib2
from lxml import etree
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
def load_page(url):
"""
作用:根據url發送請求,獲取服務器相應文件
url: 需要爬取的url地址
"""
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request).read().replace('<!--','').replace('--!>','')
# with open('sss.html','w') as f:
# f.write(response)
links = etree.HTML(response).xpath(r'//div[@class="t_con cleafix"]/div/div/div/a/@href')
print links
for link in links:
load_img(link)
print('*************')
print link
def load_img(link):
url = 'https://tieba.baidu.com'+link
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request).read()
# with open('s.html','w') as f:
# f.write(response)
my_xml = etree.HTML(response)
img_list = my_xml.xpath(r'//img[@class="BDE_Image"]/@src')
for img_src in img_list:
write_img(img_src)
def write_img(src):
request = urllib2.Request(src,headers=headers)
response = urllib2.urlopen(request).read()
with open('img/'+src[-15:],'wb') as f:
f.write(response)
def tieba_spider(url,bagin_page,end_page):
'''
作用;貼吧爬蟲調度器,負責組合處理每個頁面的url
url :貼吧url前部分
'''
#每一頁一頁的爬,用for
for i in range(bagin_page,end_page+1):
pn = (i-1)*50 #這里是百度貼吧表示 頁碼的方式
ful_url = url +'&pn=' +str(pn)
print ful_url
file_name = '第' + str(i) +'頁.html'
#調用load_page
load_page(ful_url)
if __name__ == '__main__':
kw = raw_input("輸入貼吧名:")
begain_page = int(raw_input('起始頁:'))
end_page = int(raw_input('輸入結束頁'))
url ='https://tieba.baidu.com/f?'
key = urllib.urlencode({'kw':kw})
ful_url = url +key
tieba_spider(ful_url,begain_page,end_page)
這樣就爬取了文章中的圖片了:

enter description here
總結:
- 通過xpth獲取節點時,要分析html結構。
- 瀏覽器上和用urlopen獲得的html會有不同,以response為準
- lmxl具有xpath功能