用xpath来爬图
# xpath語法可參考http://www.w3school.com.cn/xpath/xpath_syntax.asp
# 本博客引用于https://zhuanlan.zhihu.com/something-python?topic=Python# coding:utf-8 import requests from lxml import html import os import timedef header(referer):headers = {'Host': 'i.meizitu.net','Pragma': 'no-cache','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6','Cache-Control': 'no-cache','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/59.0.3071.115 Safari/537.36','Accept': 'image/webp,image/apng,image/*,*/*;q=0.8','Referer': '{}'.format(referer),}return headers# 獲取主頁列表, 解析 html 的話最好使用html.fromstring(),它有xpath函數,可用于定位元素。 def getPage(pageNum):baseUrl = 'http://www.mzitu.com/page/{}'.format(pageNum)selector = html.fromstring(requests.get(baseUrl).content)urls = []for i in selector.xpath('//ul[@id="pins"]/li/a/@href'):urls.append(i)print(i)return urls# 圖片鏈接列表, 標題 # url是詳情頁鏈接 def getPiclink(url):sel = html.fromstring(requests.get(url).content)# 圖片總數,xpath 表達式應該返回元素的話,總是返回一個數組,即使只有一個元素;其中@class表示屬性class;last()函數表示最后一個a標簽total = sel.xpath('//div[@class="pagenavi"]/a[last()-1]/span/text()')[0]# 標題title = sel.xpath('//h2[@class="main-title"]/text()')[0]# 文件夾格式dirName = u"【{}P】{}".format(total, title)# 新建文件夾os.mkdir(dirName)n = 1for i in range(int(total)):# 每一頁try:link = '{}/{}'.format(url, i+1)s = html.fromstring(requests.get(link).content)# 圖片地址在src標簽中jpgLink = s.xpath('//div[@class="main-image"]/p/a/img/@src')[0]# print(jpgLink)# 文件寫入的名稱:當前路徑/文件夾/文件名filename = '%s/%s/%s.jpg' % (os.path.abspath('.'), dirName, n)print(u'開始下載圖片:%s 第%s張' % (dirName, n))#"wb+" 以二進制寫方式打開,可以讀、寫文件, 如果文件不存在,創建該文件with open(filename, "wb+") as jpg:jpg.write(requests.get(jpgLink, headers=header(jpgLink)).content)n += 1except:pass#下面一行代碼的作用:文件作為腳本直接執行才會被執行下面代碼,而import到其他腳本中是不會被執行的,http://www.dengfeilong.com/post/60.html if __name__ == '__main__':pageNum = input(u'請輸入頁碼:')p = getPage(pageNum)for e in p:print(e)getPiclink(e)# lxml的報錯time.sleep(2)# 執行的時候用python3, 并且要安裝pip install lxml requests #虛擬環境中裝python3 #sudo apt-get install python-pip #sudo apt-get install python-virtualenv #安裝本地虛擬環境管理工具 #mkdir ~/django # 創建目錄 #cd ~/django virtualenv venv #在~/django目錄下,創建一個venv的虛擬環境 #source venv/bin/activate #開啟虛擬環境
# 本博客引用于https://zhuanlan.zhihu.com/something-python?topic=Python# coding:utf-8 import requests from lxml import html import os import timedef header(referer):headers = {'Host': 'i.meizitu.net','Pragma': 'no-cache','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6','Cache-Control': 'no-cache','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/59.0.3071.115 Safari/537.36','Accept': 'image/webp,image/apng,image/*,*/*;q=0.8','Referer': '{}'.format(referer),}return headers# 獲取主頁列表, 解析 html 的話最好使用html.fromstring(),它有xpath函數,可用于定位元素。 def getPage(pageNum):baseUrl = 'http://www.mzitu.com/page/{}'.format(pageNum)selector = html.fromstring(requests.get(baseUrl).content)urls = []for i in selector.xpath('//ul[@id="pins"]/li/a/@href'):urls.append(i)print(i)return urls# 圖片鏈接列表, 標題 # url是詳情頁鏈接 def getPiclink(url):sel = html.fromstring(requests.get(url).content)# 圖片總數,xpath 表達式應該返回元素的話,總是返回一個數組,即使只有一個元素;其中@class表示屬性class;last()函數表示最后一個a標簽total = sel.xpath('//div[@class="pagenavi"]/a[last()-1]/span/text()')[0]# 標題title = sel.xpath('//h2[@class="main-title"]/text()')[0]# 文件夾格式dirName = u"【{}P】{}".format(total, title)# 新建文件夾os.mkdir(dirName)n = 1for i in range(int(total)):# 每一頁try:link = '{}/{}'.format(url, i+1)s = html.fromstring(requests.get(link).content)# 圖片地址在src標簽中jpgLink = s.xpath('//div[@class="main-image"]/p/a/img/@src')[0]# print(jpgLink)# 文件寫入的名稱:當前路徑/文件夾/文件名filename = '%s/%s/%s.jpg' % (os.path.abspath('.'), dirName, n)print(u'開始下載圖片:%s 第%s張' % (dirName, n))#"wb+" 以二進制寫方式打開,可以讀、寫文件, 如果文件不存在,創建該文件with open(filename, "wb+") as jpg:jpg.write(requests.get(jpgLink, headers=header(jpgLink)).content)n += 1except:pass#下面一行代碼的作用:文件作為腳本直接執行才會被執行下面代碼,而import到其他腳本中是不會被執行的,http://www.dengfeilong.com/post/60.html if __name__ == '__main__':pageNum = input(u'請輸入頁碼:')p = getPage(pageNum)for e in p:print(e)getPiclink(e)# lxml的報錯time.sleep(2)# 執行的時候用python3, 并且要安裝pip install lxml requests #虛擬環境中裝python3 #sudo apt-get install python-pip #sudo apt-get install python-virtualenv #安裝本地虛擬環境管理工具 #mkdir ~/django # 創建目錄 #cd ~/django virtualenv venv #在~/django目錄下,創建一個venv的虛擬環境 #source venv/bin/activate #開啟虛擬環境
轉載于:https://www.cnblogs.com/regit/p/8529214.html
總結
- 上一篇: 「模拟赛20180307」三元组 exc
- 下一篇: 谷歌驱动下载链接