zoukankan      html  css  js  c++  java
  • python-urllib

    python-urllib快速上手

    1 import urllib.request
    2 
    3 url = 'http://www.baidu.com'
    4 file = urllib.request.urlopen(url)
    5 data = file.read()
    6 dataline = file.readline()
    7 datalines = file.readlines()

    首先导入urllib.request模块

    然后使用urllib.request.urlopen打开并爬取一个网页,此时返回的是<http.client.HTTPResponse object at 0x00000206F862C4A8>,一个HTTP响应对象。

    对于响应对象读取的三种方式:

    1. file.read() 读取文件的全部内容
    2. file.readlines() 读取文件的全部内容,与read不同的是,readlines会把读取到的内容赋给一个列表变量。(推荐)
    3. file.readline() 读取文件的一行内容

    如果希望返回与当前环境有关的信息,可以使用info()

    file.info()

    如果希望获取当前爬取网页的状态码,我们可以使用getcode()

    file.getcode()

    如果想要获取当前所爬取的URL地址,可以使用geturl()

    file.geturl()

    一般来说,URL标准中只会允许一部分ASCLL字符比如数字、字母、部分符号等,而其他的一些字符,比如汉字等,是不符合URL标准的。所以如果我们在URL中使用了一些其他不符合标准的字符就会出现问题,此时需要进行URL编码方可解决。

    如果要进行编码,可以使用urllib.request.quote()进行

    urllib.request.quote('http://www.baidu.com')

    可以看到,编码结果是'http%3A//www.baidu.com'

    相应的,有时需要对编码的网址进行解码。若要解码,可以使用urllib.request.unquote()

    urllib.request.unquote('http%3A//www.baidu.com')

    输出结果为'http://www.baidu.com'

    除了这种方法之外,还可以使用urllib.request里面的urlretrieve()函数直接将对应信息写入本地文件。格式为:“urllib.request.urlretrieve(url,filename='本地文件地址')”

    filename = urllib.request.urlretrieve('http://www.baidu.com','本地位置')

    浏览器模拟——Headers属性

    为了防止禁止爬虫访问,让爬虫模拟成浏览器

    方法一:使用build_opener()修改报头

    由于urlopen()不支持一些HTTP的高级功能,所以,我们如果要修改报头,可以使用urllib.request.build_opener()进行。

    1 import urllib.request
    2 url = '网址'
    3 headers = ('User-Agent','...')
    4 opener = urllib.request.build_opener()
    5 opener.addheaders = [headers]
    6 data = opener.open(url).read()

    方法二:使用add_header()添加报头

    可以使用urllib.request.Request()下的add_header()实现浏览器的模拟

    import urllib.request
    url = 'http://blog.csdn.net/weiwei_pig/article/details/51178226'
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36')
    data = urllib.request.urlopen(req).read()

    使用urllib.request.Request()返回的是<urllib.request.Request object at 0x000001730BE1EB70>,使用add.header为Request对象添加报头。

    此时已经成功设置好报头,然后我们使用urlopen()打开Request对象即可打开对应网站,得到一个HTTP的响应对象。

    超时设置

    有的时候,我们访问一个网页,如果该网页长时间未响应,那么系统就会判断该网页超时了。既无法打开该网页。

    有的时候,我们需要根据自己的需要来设置超时的时间值。

    import urllib.request
    for i in range(1,100):
        try:
            file = urllib.request.urlopen('url',timeout=1)
            data = file.read()
            print(len(data))
        except Exception as e:
            print('出现异常:'+str(e))

    HTTP协议请求实战

    代理服务器设置

    可以从整理好的网址http://yum.iqianyue.com/proxy中找到很多代理服务器地址。

    有了代理ip地址之后,我们就可以通过代理服务器来爬取网站内容了。

    import urllib.request
    
    def use_proxy(proxy_addr,url):
        proxy = urllib.request.ProxyHandler({'http':proxy_addr})
        opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
        urllib.request.install_opener(opener)
        data = urllib.request.urlopen(url).read().decode('utf-8')
        return data
    
    proxy_addr = '112.85.173.20:9999'
    url = 'http://www.baidu.com'
    data = use_proxy(proxy_addr,url)
    print(len(data))
  • 相关阅读:
    如何提高沟通能力?
    如何做到科学决策?推荐你看这本《决策必读12篇》
    领导者如何让员工真心服从自己?
    MBA看什么书,MBA教材书目推荐
    有关战略管理的书,哪本最值得推荐?
    市场营销必看书籍推荐
    P1208 混合牛奶题解
    P5019 铺设道路题解
    P1728 陶陶摘苹果题解
    P1106 删数问题题解
  • 原文地址:https://www.cnblogs.com/mylearning-log/p/10886054.html
Copyright © 2011-2022 走看看