利用正則表達式和requests下載千圖網高清圖片,非會員圖片哦
網頁整體規則性比較一致,多翻閱幾個頁面就可以發現規律了,無非是
html_url = "http://www.58pic.com/tupian/jianshen-0-0-{}.html".format(n),n不斷增加,而且對於03或者3也沒有特別區分,所以翻頁構造基本就可以直接處理了
for n in range(0, 11):
print("******** 正在下載第%s頁的圖片 ********" % (n+1))
html_url = "http://www.58pic.com/tupian/jianshen-0-0-{}.html".format(n)
PicThousand().run(html_url)
對圖片的獲取直接右鍵檢查就可以看到url了,打開進去預覽就可以看到圖片了
但是這裏的後綴和平常圖片的.jpg格式不太一樣,按理說應該是對圖片的格式方面做了處理,將後綴去掉應該就是想要的高清圖了
但是網頁卻顯示了40310014的錯誤碼,有心的小夥伴們應該有了解過這個是違反了防盜鏈規則,後面的英文翻譯也能直接明白,我們再回去檢查圖片的headers,發現了referer裏面規定了圖片下載時爲空
這裏就可以簡單的在每次下載時把當前地址複製給headers裏面的referer即可
url = url_list[index].replace('!qt324', '')
self.getHtmlHeaders['Referer'] = url
網頁源碼以及url都可以直接使用正則表達式獲取,比較簡單
def getHtml(self, url):
response = requests.get(url, self.getHtmlHeaders).text
return response
def getUrl(self, text):
image_urls = re.compile('data-original="(.*?)"', re.S).findall(text)
return image_urls
完整代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@author: maya
@software: Pycharm
@file: pic.py
@time: 2018/12/19 16:13
@desc:
'''
import requests
import re
import time
class PicThousand():
def __init__(self):
self.getHtmlHeaders={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7',
}
def getHtml(self, url):
response = requests.get(url, self.getHtmlHeaders).text
print(response)
return response
def getUrl(self, text):
image_urls = re.compile('data-original="(.*?)"', re.S).findall(text)
print(image_urls)
return image_urls
def img_Download(self, url_list):
for index in range(len(url_list)):
url = url_list[index].replace('!qt324', '')
self.getHtmlHeaders['Referer'] = url
file_name = url.replace('!qt324', '').split('/')[-1]
print("正在下載第%s張圖片:%s" % (index + 1, file_name))
response = requests.get(url, headers= self.getHtmlHeaders)
with open('img/'+file_name, 'wb') as f:
f.write(response.content)
def run(self, url):
text = self.getHtml(url)
list = self.getUrl(text)
self.img_Download(list)
if __name__ == '__main__':
start = time.time()
for n in range(0, 11):
print("******** 正在下載第%s頁的圖片 ********" % (n+1))
html_url = "http://www.58pic.com/tupian/jianshen-0-0-{}.html".format(n)
PicThousand().run(html_url)
end = time.time()
print("******** 下載完成,共用時%.2f ********" % (end-start))
- 更多爬蟲代碼詳情參考Github