美文网首页Python爬虫作业
小白菜学爬虫(三):第一个小爬虫

小白菜学爬虫(三):第一个小爬虫

作者: everfight | 来源:发表于2017-05-01 20:27 被阅读60次

    向右奔跑老师写了《007 - Python简单爬虫 - 正则表达式》爬取了贴吧中的图片,留了一个任务是爬取花瓣上面的图片

    实现步骤

    根据老师的贴吧示例,简单分析花瓣爬虫的如下:
    1、获取url对应的网页源代码
    2、根据网页图片的网址特征,确定正则表达式
    3、利用正则中的findall方法进行图片地址的提取
    4、遍历图片地址用urlretrieve获取

    分析过程:

    老师文章中已经给出了正则表达式

    <img src="([.\S])"

    仔细分析发现,这种匹配无法区分图片跟头像。下载下来有很多无用的信息。


    示意图 头像示意图

    对比图片和头像的img标签,发现图片都有指定宽度width


    主图 缩略图

    而头像怎没有指定width

    头像

    故修改正则为: r'<img src="([.\S])" width' 去除掉没有width的img标签。

    实现代码

    # coding:utf-8
    from urllib import request
    import re
    
    # 获取网页源代码的方法
    def getHtml(url):
        page = request.urlopen(url)
        html = page.read().decode('utf-8') # Python3需要decode
        return html
    
    html =  getHtml('http://huaban.com/pins/1120072731/')
    reg = r'<img src="([.*\S]*)" width'
    imgurls = re.findall(reg, html)  #用正则匹配到的图片路径的集合
    
    x = 1
    for imgurl in imgurls:
        imgurl ='http:'+ str(imgurl)
        print (imgurl)  # 打印查看一下是不是 每个图片的URL
        request.urlretrieve(imgurl, 'images2/%s.jpg' % x)
        print ("正在下载第 %d 张"%x)
        x +=1
    

    注意事项

    因为我用的版本是python3版本,代码存在些许差异,比方说:
    1、在Python3中print为函数:print (imgurl)
    2、urlopen在request下:request.urlopen(url)
    修改完成后运行程序,报错:TypeError: cannot use a string pattern on a bytes-like object
    查询资料得知python3中urllib.read返回的是bytes对象,不是string,得把它decode转换成string对象:page.read().decode('utf-8')

    运行结果

    采集结果

    存在缺陷

    现在采集到的还只是图片的缩略图,没有能够深入到画板的主页面去采集原图。后面考虑获取到画板缩略图的源地址,去源地址进行原图片的获取。

    相关文章

      网友评论

        本文标题:小白菜学爬虫(三):第一个小爬虫

        本文链接:https://www.haomeiwen.com/subject/zilqtxtx.html