1. 程式人生 > >Python學習 —— 實現簡單爬蟲

Python學習 —— 實現簡單爬蟲

發現 guid openssl 取圖 lib 列表 了解 菜鳥 頁面數據

  為了加快學習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學習 —— 實現簡單爬蟲