码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习 —— 实现简单爬虫

时间:2018-01-06 20:05:14      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:pattern   font   tab   ros   def   return   一个   urlopen   span   

  为了加快学习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学习 —— 实现简单爬虫

标签:pattern   font   tab   ros   def   return   一个   urlopen   span   

原文地址:https://www.cnblogs.com/darkchii/p/8214949.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!