爬蟲day04 xpath,私密代理
目錄
存入csv檔案
1.csv模組的使用流程 1.Python語句開啟csv檔案: with open("測試.csv","a") as f: pass 2.初始化寫入物件 writer方法:writer = csv.writer(f) 3.寫入資料 writerow()方法:writer.writerow([]) 2.示例
import csv with open("測試.csv","a",newline="") as f: # 初始化寫入物件 writer = csv.writer(f) # 寫入資料 writer.writerow([]) writer.writerow(["id","name","age"]) writer.writerow(["1","Lucy","20"]) writer.writerow(["2","Tom","25"])
2.Xpath 工具(解析html)
1.Xpath
在XML文件中查詢資訊的語言,同樣適用於HTML文件的檢索
2.Xpath輔助工具
1.Chrome外掛:XPath Helper
開啟/關閉:Ctrl+Shift+大寫X
2.FireFox外掛:Xpath checker
3.XPath表示式編輯工具:XML Quire
3.XPath匹配規則
1.匹配演示
1.查詢bookstore下面的所有節點: /bookstore
2.查詢所有book節點: //book
3.查詢所有book節點下title節點中,lang屬性為"en"的節點://book/title[@lang="en"]
2.選取節點
/ : 從根節點開始選取 /bookstore
//: 從整個文件中查詢某個節點 //price
@ : 選取某個節點的屬性 //title[@lang="en"]
3.解析HTML原始碼
1.lxml庫:HTML/XML解析庫 1.安裝 conda install lxml pip install lxml
uninsall remove autoremove 2.使用流程 1.利用lxml庫的etree模組構建解析物件 2.解析物件呼叫xpath工具定位節點資訊 2.使用 1.匯入模組 from lxml import etree 2.建立解析物件:parseHtml = etree.HTML(html) 3.呼叫xpath進行解析: r_list = parseHtml.xpath('//title[@lang="en"]') # 只要呼叫了xpath,則結果一定是列表 3.示例+練習 4.案例:抓取百度貼吧帖子裡面的圖片 1.目標:抓貼吧中帖子圖片 2.思路 1.獲取貼吧主頁URL:美女吧 下一頁:URL規律 2.獲取美女吧中每個帖子的URL 3.對每個帖子發請求,獲取帖子裡所有圖片的URL 4.對圖片URL發請求,以wb的方式寫入本地檔案 3.步驟 1.獲取貼吧的URL http://tieba.baidu.com/f? + 一堆查詢引數 pn = (page-1)*50 2.獲取每個帖子的URL http://tieba.baidu.com + /p/5866881218 //div[@class="threadlist_title pull_left j_th_tit "]/a/@href 3.開啟每個帖子 http://imgsrc.baidu.com/forum/w%3D580/sign=8bac1b1a10950a7b75354ecc3ad0625c/3c0bddc451da81cbfe7fc3e15f66d016082431e2.jpg
xpath匹配 //img[@class="BDE_Image"]/@src 4.儲存到本地
4.ProxyBasicAuthHandler私密代理Handler處理器
1.密碼管理器使用流程 1.建立密碼管理器物件 pwd = urllib.request.HTTPPasswordMgrWithDefaultRealm() 2.新增私密代理使用者名稱,密碼,IP地址,埠資訊 pwd.add_password(None,"IP:埠","使用者名稱","密碼") 1.urllib.request.ProxyBasicAuthHandler(密碼管理器物件)
作業: 1. 內涵段子 : xpath 2. 貓眼電影 : xpath匹配,本地csv檔案中
xpath示例
from lxml import etree
html = """<div class="wrapper">
<i class="iconfont icon-back" id="back"></i>
<a href="/" id="channel">新浪社會</a>
<ul id="nav">
<li><a href="http://domestic.firefox.sina.com/" title="國內">國內</a></li>
<li><a href="http://world.firefox.sina.com/" title="國際">國際</a></li>
<li><a href="http://mil.firefox.sina.com/" title="軍事">軍事</a></li>
<li><a href="http://photo.firefox.sina.com/" title="圖片">圖片</a></li>
<li><a href="http://society.firefox.sina.com/" title="社會">社會</a></li>
<li><a href="http://ent.firefox.sina.com/" title="娛樂">娛樂</a></li>
<li><a href="http://tech.firefox.sina.com/" title="科技">科技</a></li>
<li><a href="http://sports.firefox.sina.com/" title="體育">體育</a></li>
<li><a href="http://finance.firefox.sina.com/" title="財經">財經</a></li>
<li><a href="http://auto.firefox.sina.com/" title="汽車">汽車</a></li>
</ul>
<i class="iconfont icon-liebiao" id="menu"></i>
</div>"""
# 1.構建解析物件
parseHtml = etree.HTML(html)
# 2.解析物件呼叫 xpath 工具
# 獲取所有a標籤的 href屬性值
r_list = parseHtml.xpath('//a/@href')
#for i in r_list:
# print(i)
# 獲取 /
r_list = parseHtml.xpath('//a[@id="channel"]/@href')
#print(r_list)
# 獲取 非 /
#r_list = parseHtml.xpath('//ul[@id="nav"]/li/a/@href')
r_list = parseHtml.xpath('//ul[@id="nav"]//a/@href')
#print(r_list)
# 獲取所有<a>節點的文字內容
r_list = parseHtml.xpath('//a')
# 得到的是元素物件,需要用 物件名.text 獲取內容
#for i in r_list:
# print(i.text)
# 獲取 新浪社會
r_list = parseHtml.xpath('//a[@id="channel"]')
#for i in r_list:
# print(i.text)
# 獲取非 新浪社會 的節點文字
r_list = parseHtml.xpath('//ul[@id="nav"]//a')
for i in r_list:
print(i.text)