同時,之前同事也發了一個貼吧的段子聚居地,客官稍等,馬上奉上連線:
段友之家 https://tieba.baidu.com/f?ie=utf-8&kw=段友之家
然後呢,看到上面,確實好多段友在上面,於是乎,我就想爬取他們的圖片和小視訊,就有了這篇文章的主題:
其實吧,用Python爬取網站資料是最基礎的東西,也不難,但是我還想分享給大家,一起學習和交流。
爬取這些網站裡的資料主要用的模組是bs4、requests以及os,都是常用模組
大概思路就是通過requests模組請求網頁html資料,然後通過bs4模組下的BeautifulSoup分析請求的網頁,然後通過css查詢器查詢內涵段子的圖片以及小視訊的地址,主要實現程式碼如下:
def download_file(web_url):
"""獲取資源的url"""
# 下載網頁
print('正在下載網頁: %s...' % web_url)
result = requests.get(web_url)
soup = bs4.BeautifulSoup(result.text, "html.parser")
# 查詢圖片資源
img_list = soup.select('.vpic_wrap img')
if img_list == []:
print('未發現圖片資源!')
else:
# 找到資源,開始寫入
for img_info in img_list:
file_url = img_info.get('bpic')
write_file(file_url, 1)
# 查詢視訊資源
video_list = soup.select('.threadlist_video a')
if video_list == []:
print('未發現視訊資源!')
else:
# 找到資源,開始寫入
for video_info in video_list:
file_url = video_info.get('data-video')
write_file(file_url, 2)
print('下載資源結束:', web_url)
next_link = soup.select('#frs_list_pager .next')
if next_link == []:
print('下載資料結束!')
else:
url = next_link[0].get('href')
download_file('https:' + url)
複製程式碼
得到圖片以及視訊的地址之後,肯定還不夠,還得把這些資源寫入到本地,方式是通過二進位制的方式來讀取遠端檔案資源,然後分類寫入到本地,實現的主要程式碼如下:
def write_file(file_url, file_type):
"""寫入檔案"""
res = requests.get(file_url)
res.raise_for_status()
# 檔案型別分資料夾寫入
if file_type == 1:
file_folder = 'nhdz\\jpg'
elif file_type == 2:
file_folder = 'nhdz\\mp4'
else:
file_folder = 'nhdz\\other'
folder = os.path.exists(file_folder)
# 資料夾不存在,則建立資料夾
if not folder:
os.makedirs(file_folder)
# 開啟檔案資源,並寫入
file_name = os.path.basename(file_url)
str_index = file_name.find('?')
if str_index > 0:
file_name = file_name[:str_index]
file_path = os.path.join(file_folder, file_name)
print('正在寫入資原始檔:', file_path)
image_file = open(file_path, 'wb')
for chunk in res.iter_content(100000):
image_file.write(chunk)
image_file.close()
print('寫入完成!')
複製程式碼
最後,再奉上完整的程式碼吧。要不然,會被人說的,說話說一半,說福利,也不給全,這就太不夠意思了。客官別急,馬上奉上……
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
爬取百度貼吧,段友之家的圖片和視訊
author: cuizy
time:2018-05-19
"""
import requests
import bs4
import os
def write_file(file_url, file_type):
"""寫入檔案"""
res = requests.get(file_url)
res.raise_for_status()
# 檔案型別分資料夾寫入
if file_type == 1:
file_folder = 'nhdz\\jpg'
elif file_type == 2:
file_folder = 'nhdz\\mp4'
else:
file_folder = 'nhdz\\other'
folder = os.path.exists(file_folder)
# 資料夾不存在,則建立資料夾
if not folder:
os.makedirs(file_folder)
# 開啟檔案資源,並寫入
file_name = os.path.basename(file_url)
str_index = file_name.find('?')
if str_index > 0:
file_name = file_name[:str_index]
file_path = os.path.join(file_folder, file_name)
print('正在寫入資原始檔:', file_path)
image_file = open(file_path, 'wb')
for chunk in res.iter_content(100000):
image_file.write(chunk)
image_file.close()
print('寫入完成!')
def download_file(web_url):
"""獲取資源的url"""
# 下載網頁
print('正在下載網頁: %s...' % web_url)
result = requests.get(web_url)
soup = bs4.BeautifulSoup(result.text, "html.parser")
# 查詢圖片資源
img_list = soup.select('.vpic_wrap img')
if img_list == []:
print('未發現圖片資源!')
else:
# 找到資源,開始寫入
for img_info in img_list:
file_url = img_info.get('bpic')
write_file(file_url, 1)
# 查詢視訊資源
video_list = soup.select('.threadlist_video a')
if video_list == []:
print('未發現視訊資源!')
else:
# 找到資源,開始寫入
for video_info in video_list:
file_url = video_info.get('data-video')
write_file(file_url, 2)
print('下載資源結束:', web_url)
next_link = soup.select('#frs_list_pager .next')
if next_link == []:
print('下載資料結束!')
else:
url = next_link[0].get('href')
download_file('https:' + url)
# 主程式入口
if __name__ == '__main__':
web_url = 'https://tieba.baidu.com/f?ie=utf-8&kw=段友之家'
download_file(web_url)
複製程式碼