【Python】如何獲取知乎最有價值的內容
一 前言
相信大部分能看到這篇blog的人都聽說過知乎吧?如果你沒有聽說過,那麼連結在這裡 作為一個知乎er,為了更加深入的理解“xxx 是一種什麼體驗”(的圖片),為了踐行 “技術改變生活”(實則有些wuliao) ,使用requsets 爬取知乎中最優價值的內容,本文字著探索的精神,寫一段獲取內容的python程式。
二 踐行
本程式碼還存在一些不足的地方,無法完全獲取全部的圖片,需要在相容 自動點選 ”更多“ 載入更多答案。
程式碼第二版解決了第一版程式碼中不能自動載入的問題。
相信大部分能看到這篇blog的人都聽說過知乎吧?如果你沒有聽說過,那麼連結在這裡 作為一個知乎er,為了更加深入的理解“xxx 是一種什麼體驗”(的圖片),為了踐行 “技術改變生活”(實則有些wuliao) ,使用requsets 爬取知乎中最優價值的內容,本文字著探索的精神,寫一段獲取內容的python程式。
二 踐行
-
#!/usr/bin/env python
-
#-*- coding:utf-8 -*-
-
import re
-
import requests
-
import os
-
from urlparse import urlsplit
- from os.path import basename
-
def getHtml(url):
-
session = requests.Session()
-
# 模擬瀏覽器訪問
-
header = {
-
'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
-
'Accept-Encoding': 'gzip, deflate'}
-
res = session.get(url, headers=header)
-
if res.status_code == 200:
-
content = res.content
-
else:
-
content = ''
-
return content
-
-
def mkdir(path):
-
if not os.path.exists(path):
-
print '新建資料夾:', path
-
os.makedirs(path)
-
return True
-
else:
-
print u"圖片存放於:", os.getcwd() + os.sep + path
-
return False
-
-
def download_pic(img_lists, dir_name):
-
print "一共有 {num} 張照片".format(num=len(img_lists))
-
for image_url in img_lists:
-
response = requests.get(image_url, stream=True)
-
if response.status_code == 200:
-
image = response.content
-
else:
-
continue
-
file_name = dir_name + os.sep + basename(urlsplit(image_url)[2])
-
try:
-
with open(file_name, "wb") as picture:
-
picture.write(image)
-
except IOError:
-
print("IO Error\n")
-
return
-
finally:
-
picture.close
-
print "下載 {pic_name} 完成!".format(pic_name=file_name)
-
-
def getAllImg(html):
-
# 利用正規表示式把原始碼中的圖片地址過濾出來
-
#reg = r'data-actualsrc="(.*?)">'
-
reg = r'\d.zhimg.com/[a-fA-F0-9]{5,32}_\w+.jpg'
-
imgre = re.compile(reg, re.S)
-
tmp_list = imgre.findall(html) # 表示在整個網頁中過濾出所有圖片的地址,放在imglist中
-
# 清理掉頭像和去重 獲取data-original的內容
-
tmp_list = list(set(tmp_list)) # 去重
-
imglist = []
-
for item in tmp_list:
-
if item.endswith('r.jpg'):
-
img_list.append(item)
-
print 'num : %d' % (len(imglist))
-
return imglist
-
-
-
if __name__ == '__main__':
-
question_id = 35990613
-
zhihu_url = "{qid}".format(qid=question_id)
-
html_content = getHtml(zhihu_url)
-
path = 'zhihu_pic'
-
mkdir(path) # 建立本地資料夾
-
img_list = getAllImg(html_content) # 獲取圖片的地址列表
- download_pic(img_list, path) # 儲存圖片
本程式碼還存在一些不足的地方,無法完全獲取全部的圖片,需要在相容 自動點選 ”更多“ 載入更多答案。
程式碼第二版解決了第一版程式碼中不能自動載入的問題。
-
#!/usr/bin/env python
-
#-*- coding:utf-8 -*-
-
import re
-
import requests
-
import os
-
from urlparse import urlsplit
-
from os.path import basename
-
-
headers = {
-
'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
-
'Accept-Encoding': 'gzip, deflate'}
-
-
-
def mkdir(path):
-
if not os.path.exists(path):
-
print '新建資料夾:', path
-
os.makedirs(path)
-
return True
-
else:
-
print u"圖片存放於:", os.getcwd() + os.sep + path
-
return False
-
-
-
def download_pic(img_lists, dir_name):
-
print "一共有 {num} 張照片".format(num=len(img_lists))
-
for image_url in img_lists:
-
response = requests.get(image_url, stream=True)
-
if response.status_code == 200:
-
image = response.content
-
else:
-
continue
-
file_name = dir_name + os.sep + basename(urlsplit(image_url)[2])
-
try:
-
with open(file_name, "wb") as picture:
-
picture.write(image)
-
except IOError:
-
print("IO Error\n")
-
continue
-
finally:
-
picture.close
-
print "下載 {pic_name} 完成!".format(pic_name=file_name)
-
-
-
def get_image_url(qid, headers):
-
# 利用正規表示式把原始碼中的圖片地址過濾出來
-
#reg = r'data-actualsrc="(.*?)">'
-
tmp_url = ""
-
size = 10
-
image_urls = []
-
session = requests.Session()
- # 利用迴圈自動完成需要點選 “更多” 獲取所有答案,每個分頁作為一個answer集合。
-
while True:
-
postdata = {'method': 'next', 'params': '{"url_token":' +
-
str(qid) + ',"pagesize": "10",' + '"offset":' + str(size) + "}"}
-
page = session.post(tmp_url, headers=headers, data=postdata)
-
ret = eval(page.text)
- answers = ret['msg']
-
size += 10
-
if not answers:
-
print "圖片URL獲取完畢, 頁數: ", (size - 10) / 10
-
return image_urls
-
#reg = r'\d.zhimg.com/[a-fA-F0-9]{5,32}_\w+.jpg'
-
imgreg = re.compile('data-original="(.*?)"', re.S)
-
for answer in answers:
-
tmp_list = []
-
url_items = re.findall(imgreg, answer)
-
for item in url_items: # 這裡去掉得到的圖片URL中的跳脫字元'\\'
-
image_url = item.replace("\\", "")
-
tmp_list.append(image_url)
-
# 清理掉頭像和去重 獲取data-original的內容
-
tmp_list = list(set(tmp_list)) # 去重
-
for item in tmp_list:
-
if item.endswith('r.jpg'):
-
print item
-
image_urls.append(item)
-
print 'size: %d, num : %d' % (size, len(image_urls))
-
-
-
if __name__ == '__main__':
-
question_id = 26037846
-
zhihu_url = "{qid}".format(qid=question_id)
-
path = 'zhihu_pic'
-
mkdir(path) # 建立本地資料夾
-
img_list = get_image_url(question_id, headers) # 獲取圖片的地址列表
- download_pic(img_list, path) # 儲存圖片
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-2138599/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python tkinter如何獲取label內容?Python
- python中獲取如何Series值Python
- js獲取select選中項的值和文字內容JS
- Jquery如何獲取和設定元素內容?jQuery
- 知乎:2021年內容營銷平臺價值洞察白皮書(附下載)
- 29個最有價值的IT認證
- 資料就是最有價值的資產
- python兩種獲取剪貼簿內容的方法Python
- js如何獲取網頁尾本程式碼的內容JS網頁
- javascript 獲取iframe中內容JavaScript
- PHP獲取HTTP body內容的方法PHPHTTP
- jquery獲取具有指定內容的元素jQuery
- 如何獲取cookie值Cookie
- 請教如何獲取logic:iterate內設定的值
- Python教程:如何獲取顏色的RGB值Python
- 怎麼透過Python獲取檔案指定行的內容?Python
- php獲取xml檔案內容PHPXML
- jQuery - 獲取內容和屬性jQuery
- java 獲取URL連結 內容Java
- 獲取html標籤包裹的文字內容HTML
- C++--Win32--列表編輯--獲取列表內容--獲取列表行數--修改列表內容C++Win32
- uniapp獲取通知欄內容 監聽通知欄內容APP
- jQuery獲取元素內部元素和獲取內容的區別、獲得輸入框value的方法jQuery
- 如何獲取變數token的值變數
- 如何獲取變數 token 的值變數
- 蘋果成《福布斯》年度全球最有價值品牌蘋果
- 最有價值的八類SaaS企業應用
- javascript如何獲取內聯樣式和外部樣式表的值JavaScript
- 請教如何獲取logic:iterate內設定的值(重發)
- Flutter冷知識 | 獲取dart的print內容FlutterDart
- php獲取網頁內容的三種方法PHP網頁
- 獲取或者設定textarea文字域的內容
- PHP獲取目錄中的全部內容RecursiveDirectoryIteratorPHP
- Android 如何獲取RadioGroup選中RadioButton的內容Android
- jQuery捕獲-獲取DOM元素內容和屬性jQuery
- Rust 程式設計影片教程對應講解內容-使用 if let 獲取 Some 的值Rust程式設計
- javascript如何獲取屬性值JavaScript
- jQuery如何獲取指定元素的索引值jQuery索引