测试之道--网络爬虫系列3(urllib库介绍)

  • urllib库简介
    urllib是python3.x中用于操作URL的一个模块(库),合并了python2.x中的urllib、urllib2库。

  • 快速爬取网页
    import urllib.request as url_req
    with url_req.urlopen(“http://www.baidu.com“) as file:
    下面要读取网页内容
    法一(一行一行读):
           for line in file:
              print(line)
    法二(一次性全部读出来):
           page = file.read()
              print(page)
    file有以下几种方法:
    file.readline():执行一次读取一行
    file.read():读取全部存入一个字符串
    file.readlines():返回一个列表,列表的每一项为网页内容的每一行
    需要注意的有以下两点:
    1)file对象执行file.read()后文件指针就指向了最后,所以再次执行时返回的就是空串了,但是file对象又没有seek方法,所以只能重新执行urlopen(url)或者将page=file.read()赋值给一个变量以便于后续处理。
    2)file.read()、file.readline()方法返回的字符串为b”…”二进制字符串,所以打印时会有一个b开头,且中文显示为十六进制,且即使print这个字符串,里面的转义字符还是不会被解析,解决方法可以为:print(file.read().decode(‘utf-8’))或者print(file.read().decode());再转化为二进制文件的方法为:print(file.read().decode().encode()),即转化方法如下:二进制.decode()—》普通字符串;普通字符串.encode()—》二进制。

  • 将爬取的网页以网页的形式保存到本地
    思路一:
    1)将爬取的网页内容read()出来赋值给一个变量page
    2)以写入的方式打开一个本地文件,命名为*.html格式
    3)将变量page的值写入到本地文件中,注意步骤1中读出的page是二进制,所以步骤二要以open(‘a.html’,’wb’)方式本地html文件,若是page转化为字符串格式,那么步骤二这里要对应起来open(‘a.html’,’w’)即可;
    data = url_req.urlopen(‘http://edu.51cto.com‘).read()
    with open(‘/Users/macxunlei/Desktop/python3/爬虫/edu_51cto.html’,’wb’) as f:
        f.write(data)
    找到路径下的edu_51cto.html用浏览器打开即可
    注意:html里面中文没有乱码,但是用safari打开中文乱码,但是chrome浏览器打开就不会,是浏览器设置问题,safari浏览器–》偏好设置–》高级–》默认编码改为:Unicode(UTF-8)即可解决乱码问题。
    思路二:直接利用urllib.request的urlretrieve方法,如下
    urllib.request.urlretrieve(‘http://edu.51cto.com‘,filename=’/Users/macxunlei/Desktop/python3/爬虫/2.html’),这样在相应的目录下就下载好了本地2.html文件,此种方法会产生一些缓存,用urllib.request.urlcleanup()清除缓存

  • urllib.request.urlopen()生成的文件对象的其他方法和属性
    file = urllib.request.urlopen(‘http://www.jd.com‘)
    1)查看当前环境有关信息:
          file.info() —>> http.client.HTTPMessage at 0x1106340b8
    2)获取当前爬取网页的状态码(200为响应成功):
          file.getcode()
    3)获取当前爬取的url地址:
          file.geturl()

  • python3中的urlopen对于中文url如何处理
    比如http://dotamax.com/,看下源码的话,上方的搜索框的name=p,输入内容点击搜索以后,通过GET方法进行传递,比如我们搜索”意“,url变为http://dotamax.com/search/?q=意。但是url中是不允许出现中文字符的,这时候就改用urllib.parse.quote方法对中文字符进行转换。
    url = “http://dotamax.com/
    search = “search/?q=” + urllib.parse.quote(“意”)
    url1 = url + search
    html = urllib.request.urlopen(url1)
    本以为这样就可以了但是,执行之后报http.client.RemoteDisconnected: Remote end closed connection without response错误,原来是因为利用 urllib 发起的请求,UA 默认是 Python-urllib/3.5 而在 chrome 中访问 UA 则是 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36,因为服务器根据 UA 来判断拒绝了 python 爬虫,所以要采用下面的方法加上headers将爬虫伪装成浏览器:
    法一:
    import urllib
    url = “http://dotamax.com/
    search = “search/?q=” + urllib.parse.quote(“意”)
    url1 = url + search
    headers = {‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36’}
    req = urllib.request.Request(url1, headers=headers)
    file = urllib.request.urlopen(req)
    page = file.read()
    法二:
    import urllib
    url = “http://dotamax.com/
    search = “search/?q=” + urllib.parse.quote(“意”)
    url1 = url + search
    req = urllib.request.Request(url1)
    req.add_header(‘User-Agent’,’Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36’)
    file = urllib.request.urlopen(req)
    page = file.read()

    注意:
    1)经测试urllib.parse.quote(url)和urllib.request.quote(url, encoding=’utf-8’)均可以实现
    2)需要注意的是不能对整个url调用quote方法,只能单独对中文字符使用,然后再字符串拼接成完整url
    3)urllib.parse.unquote(url)和urllib.request.unquote(url)为刚才的反过程:
          urllib.parse.quote(‘意’)—>’%E6%84%8F’
          urllib.parse.unquote(‘%E6%84%8F’)—>’意’
    改成urllib.request.unquote也同样可以。

  • 超时设置
    有时我们需要根据自己的需要来设置超时时间,timeout为urlopen的一个参数:
    import urllib.request
    for i in range(1,100):
            try:
                   file = urllib.request.urlopen(‘http://yum.iqianyue.com‘, timeout = 1)
                   data = file.read()
                   print(len(data))
            except Exception as e:
                  print(‘出现异常–》’+str(e))
    这里写图片描述
    上述代码中,我们设置了超时时间为1s,循环了99次,有少部分超时

  • 关于urllib.request.urlretrieve(url,filename)
    import urllib.request
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    url=”’https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1511086352563&di=1053808d3617835379b9228efe8a60e1&imgtype=0&src=http%3A%2F%2Fpic.yesky.com%2FuploadImages%2F2015%2F169%2F30%2F80I57T1H7XEX.jpg”’
    urllib.request.urlretrieve(url, ‘1.jpg’)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值