Python學習 —— 實現簡單爬蟲
為了加快學習python3.x於是直接看了許多有實際操作的小項目,查了許多資料後寫了這個腳本,這個腳本主要是爬取百度圖片‘東方幻想鄉‘的圖片,但發現有幾個問題:
1.圖片會重復兩次。
2.圖片只有81張,只匹配了fm=27的圖片...
下面給出代碼:
from urllib import request import re class CrawlJPG: #定義一個爬取圖片的類 def __init__(self): # 構造函數 print(‘Link start!‘) def __GetHtml(self, html): post = request.urlopen(html) page = post.read() return page def __GetImg(self, html): page = self.__GetHtml(html) # 獲取 html 頁面數據 page = page.decode(‘utf-8‘) # 將格式轉換為utf-8格式 TypeError: cannot use a string pattern on a bytes-like object recomp = re.compile(r‘https://\w{3}.\w{8}.\w{3}/\w{27}/\w{2}/u=[0-9]{9,10},[0-9]{9,10}&fm=\w{2}&gp=0.jpg‘) imgUrlList = recomp.findall(page) # 和 html 頁面正則匹配 return imgUrlList # 返回匹配得到的 jpg 的 url 列表 def run(self, html): imgUrlList = self.__GetImg(html) ImgName = 0 fp = open(‘C:\\Users\\adimin\\Desktop\\CrawlImg\\imgUrl.txt‘, ‘w‘) for imgUrl in imgUrlList: request.urlretrieve(imgUrl, ‘C:\\Users\\adimin\\Desktop\\CrawlImg\\{}.jpg‘ .format(str(ImgName))) print(‘Downloads:‘ + imgUrl) fp.write(str(imgUrl)) ImgName += 1 fp.close() def __del__(self): # 析構函數 print("Download finished!") def main(): url = ‘https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gbk&word=%B6%AB%B7%BD%BB%C3%CF%EB%CF%E7&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111‘ GetImg = CrawlJPG() GetImg.run(url) if __name__ == ‘__main__‘: main()
參考了許多博客和資料,主要有:
1.http://blog.csdn.net/clj198606061111/article/details/50816115
2.https://www.cnblogs.com/speeding/p/5097790.html
3.http://urllib3.readthedocs.io/en/latest/
4.https://pyopenssl.org/en/stable/
5.https://docs.python.org/3.6/library/urllib.html
6.https://segmentfault.com/q/1010000004442233/a-1020000004448440
7.http://urllib3.readthedocs.io/en/latest/user-guide.html
8.菜鳥教程-python3
還有一些記不得了...
然後,通過這次的學習學到了很多,基本熟悉了python3的基本語法,還了解了正則表達式的寫法等,於是用了面向對象的方式進行編程。
代碼中可以看到:一個爬取圖片的類,構造函數、析構函數等。
其實對於urllib3 package我還是有很多地方不明白。。。比如,我還寫了另一個版本的url請求,用了urllib3.PoolManager(),運行沒問題,但沒辦法下載圖片
from urllib import request
import urllib3
import certifi
import re
class CrawlJPG: #定義一個爬取圖片的類
def __init__(self): # 構造函數
print(‘Link start!‘)
def __GetHtml(self, html):
post = urllib3.PoolManager( # 初始化,為了解決一個證書問題 安裝了 pyOpenSSL 就有了certifi package,這樣寫就解決了InsecureRequestWarning的
警告
cert_reqs=‘CERT_REQUIRED‘,
ca_certs=certifi.where()
)
post = post.urlopen(‘GET‘, html) # 請求打開網頁
page = post.read() # 讀取頁面數據
return page
def __GetImg(self, html):
page = self.__GetHtml(html) # 獲取 html 頁面數據
page = page.decode(‘utf-8‘) # 將格式轉換為utf-8格式 TypeError: cannot use a string pattern on a bytes-like object
recomp = re.compile(r‘https://\w{3}.\w{8}.\w{3}/\w{27}/\w{2}/u=[0-9]{9,10},[0-9]{9,10}&fm=\w{2}&gp=0.jpg‘)
imgUrlList = recomp.findall(page) # 和 html 頁面正則匹配
return imgUrlList # 返回匹配得到的 jpg 的 url 列表
def run(self, html):
imgUrlList = self.__GetImg(html)
ImgName = 0
fp = open(‘C:\\Users\\adimin\\Desktop\\CrawlImg\\imgUrl.txt‘, ‘w‘)
for imgUrl in imgUrlList:
request.urlretrieve(imgUrl, ‘C:\\Users\\adimin\\Desktop\\CrawlImg\\{}.jpg‘ .format(str(ImgName)))
print(‘Downloads:‘ + imgUrl)
fp.write(str(imgUrl))
ImgName += 1
fp.close()
def __del__(self): # 析構函數
print("Download finished!")
def main():
url = ‘https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gbk&word=%B6%AB%B7%BD%BB%C3%CF%EB%CF%E7&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111‘
GetImg = CrawlJPG()
GetImg.run(url)
if __name__ == ‘__main__‘:
main()
再好好研究一段時間吧。
對了 上次說沒能用PyCharm來寫的問題我已經解決了。但對python的關鍵字不太熟,還是配合上sublimb Text比較好...
最後,這篇就總結到這了。
Python學習 —— 實現簡單爬蟲