廢話先不多說课锌,先上代碼:
<pre class="hljs python">
<code class='python'>
import requests
from bs4 import BeautifulSoup
import os,re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
url = 'http://www.bfpgf.com/yld'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }#寫一個headers
def get_soup(url):#獲取bs4的對象
r = requests.get(url,headers=headers) # 使用requests獲取網(wǎng)頁,在這添加請求頭产阱,應對反爬蟲
print r.status_code
soup = BeautifulSoup(r.content, 'html.parser') # 把頁面處理成bs的對象狡赐,好進行下一步操作
return soup#返回bs4對象
def download_img(url,page_number):
soup = get_soup(url)
img_urls = soup.article.find_all('img')
numerb_of_arr = len(img_urls)#獲取當前頁面圖片的數(shù)量
title = soup.find_all('h1',attrs={'class':'article-title'})#獲取到標題所在的標簽
dir_name = title[0].a.text#設置文件夾的名字
if os.path.isdir(dir_name):#判斷當前目錄下是否有文件夾存在稚虎,不存在的話創(chuàng)建一個與標題名稱相同的文件夾
pass
else:
os.mkdir(dir_name)
for index , img_url in enumerate(img_urls):#獲取序列號方便寫圖片的名字
file_name_suffix = re.findall(r'.[^./:*?<>|rn]+$', img_url['src'])[0]#通過正則獲取圖片的格式
img_index = page_number + index#計算這是第幾張圖片
img_name = str(img_index) + str(file_name_suffix)#拼接出圖片的名稱
file_name = os.path.join(dir_name,img_name)
url_download_img = 'http://www.bfpgf.com' + img_url['src']
print '開始下載第' + ' ' + str(img_index+1) + ' ' + '張圖片'
req = requests.get(url_download_img,headers=headers)
img = req.content
with open(file_name, 'wb') as f:
f.write(img)
page_number += numerb_of_arr#為了圖片名稱計算出之前頁面有多少圖片
if len(soup.find_all('a',attrs={'class':'nextpostslink'}))!=0:
next_url = soup.find_all('a',attrs={'class':'nextpostslink'})[0]['href']#下一頁的地址
print next_url
download_img(next_url,page_number)
def get_target_url(url):
soup = get_soup(url)
target_urls = soup.find_all('h2')
for target_url in target_urls:# 在這調(diào)用下載圖片的方法
print '\n' + '正在抓取' + ' ' + str(target_url.a['title']) + '\n'
download_img(target_url.a['href'],0)
if soup.find('li', attrs={'class': 'next-page'}).a:# 如果有下一頁的話
print '\n' + '開始抓取下一頁' + '\n'
next_page_url = soup.find('li', attrs={'class': 'next-page'}).a['href']
get_target_url(next_page_url)
else:
print '\n' + '全站抓取完成'
get_target_url(url)
</code>
這一次抓的還是一個開車網(wǎng)站乡范,測試了一下還是需要添加headers的。
本來這周想直接上sracpy生年,然后看了幾天關于它的教程婴程,比如 廖雪峰 老師和大神 靜覓 的,但是感覺自己沒有需求抱婉,強行搞一個需求寫起來實在不順心档叔,所以思前想后還是先別用scrapy了吧,雖然我都裝好寫了一個小小的爬蟲了蒸绩。
上次寫的關于lofter想抓全站或者排名前幾的攝影社的圖片衙四,可是實在搞不懂通用的標識,當然肯定是我太菜了患亿,沒有找到传蹈,不過沒事,這次找到了<a >這個網(wǎng)站</a>
開車是我最喜歡的事兒了步藕,更何況還能用代碼飆車卡睦,運行程序之后會自動創(chuàng)建文件夾并且下載對應的圖片到文件夾里,如圖:
說實話漱抓,還有一個問題沒有完美解決,就是
如何判斷當前文件已經(jīng)存在恕齐,不需再次下載
因為現(xiàn)在實在有點晚乞娄,所以這個問題暫時不解決,留著明天看一看显歧。
不過這次結(jié)局了上次1024無法下載圖片的問題仪或,也是明天我試試,原來下載圖片也可以帶headers啊士骤,這么說的話requests比urllib好用多了范删。
為了寫多頁面的圖片下載,我用了兩次遞歸拷肌,直到?jīng)]有下一頁到旦,程序就停止運行了。
<code>get_soup(url)</code>這個函數(shù)我更是用了兩次巨缘,雖然沒提高多大的效率添忘,不過也是第一次在python里復用~還是挺開心的。
其余沒有多大的問題若锁,就是在urllib用urlretrieve下載的時候只能下載一個搁骑,然后讓大侄子去運行卻能全部下載,沒辦法,只能換了requests的下載并且?guī)狭薶eaders仲器,然后就完美的運行成功了煤率。
最后一句話送給大家