• 在python3中使用urllib.request编写简单的网络爬虫


    Python官方提供了用于编写网络爬虫的包 urllib.request, 我们主要用它进行打开url,读取url里面的内容,下载里面的图片。

    分以下几步:

    step1:用urllib.request.urlopen打开目标网站

    step2:由于urllib.request.urlopen返回的是一个http.client.HTTPResponse object,无法直接读取里面的内容,所以直接调用该对象的方法read(),获取到页面代码,存到html里

    step3:构建正则表达式,从页面代码里提取出图片url地址。

    step4:根据图片url地址,用urllib.request.retrieve下载到本地

    容易出错的地方:

    1:python2.x和python3.x中,urlopen具体在哪个包里是不一样的。如果你要在python2.x上实现,要自行百度正确的包。

    2:最容易出错的地方是正则表达式,容易出现匹配错误。我程序里写的正则表达式,在目前的网址里是正确的,如果是其他网址可能还会出问题,要具体问题具体分析,去debug。

    比如如果img_re=re.compile(r'(?<=src=)"w+?jpg"')的话,会匹配成""http://tieba.........."

     
     
     
    下面是具体代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import urllib.request
    import re
    def getHtml(url):
        #print("正在打开网页并获取....")
        page=urllib.request.urlopen(url)
        Html=str(page.read())
        print("成功获取....")
        return Html
    def getImg(html):
        img_re=re.compile(r'(?<=src=")S+?jpg')
        #img_re=re.compile(r'src="(.*?.jpg)"')
        print("the type of html is :",type(html))
        img_list=img_re.findall(html)
        print("len(img_list)=",len(img_list))
        print("img_list[0]=",img_list[0])
        print("正在下载图片......")
        for in range(len(img_list)):
            print("img_list[%d]=%s" % (i,img_list[i]))
            urllib.request.urlretrieve(img_list[i],'%s.jpg' % i)
        print("完成图片下载......")
        print("一共抓到了%d张图片" % len(img_list))
    if __name__=="__main__":
        url_baidu="http://tieba.baidu.com/f?kw=%B0%A2%C9%AD%C4%C9"
        html=getHtml(url_baidu)
        getImg(html)
  • 相关阅读:
    2019-8-31-C#-标准性能测试高级用法
    2018-8-29-Roslyn-通过-Target-修改编译的文件
    2018-8-29-Roslyn-通过-Target-修改编译的文件
    2018-2-13-图论-Warshall-和Floyd-矩阵传递闭包
    2018-2-13-图论-Warshall-和Floyd-矩阵传递闭包
    2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记
    netfilter
    mmap内存映射
    vim替换字符串
    vim环境配置
  • 原文地址:https://www.cnblogs.com/ArsenalfanInECNU/p/4780883.html
Copyright © 2020-2023  润新知