1-19日更新谆沃。
今天打開電腦,又跑了一遍代碼仪芒。發(fā)現唁影,整個87頁都能下載下來了耕陷,估計是ip解封了,說明我編寫的代碼据沈,能運行S茨!锌介!
結果如圖:
不過嗜诀,也發(fā)現了一個問題。圖片中的86頁等是沒有被解析成功的孔祸,似乎直接跳過了隆敢?這是怎么個情況?我還沒有想明白崔慧。拂蝎。。
--------------------------------------------------分割線-------------------
找了一個番號網站練練手尊浪,發(fā)現還有一些難度。
首先封救,我要實現的是拇涤,將網站上每個女憂的圖片下載到本地文件夾并且把圖片名稱改成女優(yōu)名字。
網站是這樣的:http://www.fanh.cc/fanhao/index_19.html
遇到的幾個問題誉结。
第一鹅士,編碼問題。
網頁編碼默認是gb2312的惩坑,跟平時接觸的不一樣掉盅。
最后結局辦法也是出乎我意料。用到了text和content屬性的區(qū)別以舒。
第二趾痘,就是網站封ip。
我初次爬的時候蔓钟,可以爬到第26頁(一共89頁)永票,但是后來重新爬的時候明顯爬不動了,爬個幾頁就會停止滥沫。我估計就是他們這個網站限制了我的ip侣集,屏蔽我了,然后我換了代理ip兰绣,并且加上了headers世分,就可以正常訪問了。但是依舊沒辦法爬取總共89頁缀辩,這也是一個問題臭埋。值得深入研究一下踪央。
第三,就是對“urllib.request.urlretrieve()”這個方法中的參數斋泄,深入研究了一下杯瞻,發(fā)現還有一些門道的。
不說了炫掐,開始貼代碼魁莉。其實代碼能夠正常運行。有一點募胃,沒有解決:如何突破網站屏蔽的限制旗唁?
#!/usr/bin/env python
# 最終目標。下載網頁所有女憂的圖片到本地,并且圖片名字改成對應的女憂名字痹束。第一,到最后一頁检疫。--最后,完美達成此目標。
# 接下來新的挑戰(zhàn)祷嘶。
'''
01,添加計數器,到了第幾頁,第X張圖片,都會打印出來屎媳。
02,多線程或者多進程爬去,提高速度。
03,加一個進度條论巍。
#目前運行到第12也就暫停了,為何??? 有的女憂的名字比較特殊,AZUMI/上原安住,結果弄得下載到文本有問題烛谊。
FileNotFoundError: [Errno 2] No such file or directory: '/Users/pro/Desktop/a2/AZUMI/上原安住.jpg',需要研究一下path參數了
答:這個問題基本解決了。
但是,出現了個新問題,似乎ip被屏蔽了,沒辦法流暢下載圖片了,原先能下載15頁,但是現在不用代理ip只能下載到4頁左右嘉汰。
'''
import requests,time
from bs4 import BeautifulSoup
import urllib.request
path='/Users/pro/Desktop/a2/'
url = 'http://www.fanh.cc/fanhao/index_2.html'
proxies = {"http": "120.35.30.178:80"}
def download(url,title):
urllib.request.urlretrieve(url,path + (title.split('/')[-1] + '.jpg'))
#圖片名字這里丹禀,我花了很多心思,發(fā)現原來這里可以用到split屬性鞋怀,因為有些女優(yōu)的名字是XX/xx這樣的格式双泪,如果不修改會報錯。現在改過來了密似,這就沒問題了焙矛。
time.sleep(2)
#print("Done")
def download_pic(url):
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36 QQBrowser/4.1.4132.400'
}
y=1
wb_data = requests.get(url,headers=headers)
soup = BeautifulSoup(wb_data.content,'lxml')
#這里要注意text屬性與content屬性的區(qū)別。
#text屬性返回的是Unicodex型的數據残腌。而content返回的是二進制類型的數據薄扁。此處,用content就不會有亂碼,而text屬性就不行。
titles = soup.select('body > div.list > ul > li > p > a')
pic_links = soup.select('body > div.list > ul > li > a > img')
for title,pic_link in zip(titles,pic_links):
data = {
'title': title.get_text(),
'link' : 'http://www.fanh.cc'+ pic_link.get('src') #fanh.cc才是正確的網址,這里之前寫的是fanhao.cc,出錯過废累。
}
#運行到這個時候,data是一個字典結果邓梅。接下來的download函數如何調用字典中的數據是個難題!
download(data['link'],data['title'])
print('第%s張圖片'%y)
y=y+1
print(data)
#接下來,運行程序邑滨,如下
all_page_links=['http://www.fanh.cc/fanhao/index_{}.html'.format(number) for number in range(2,89)]
p=1
for single_link in all_page_links:
download_pic(single_link) #這里也出現了一個小失誤,應該填寫single_link的,結果我寫了url測試半天都不正確日缨。尷尬。
print('第{}頁'.format(p))
p=p+1
下面是運行結果: