• Python爬虫第二天


    Python爬虫第二天
     
    超时设置
            有时候访问网页时长时间未响应,系统就会判断网页超时,无法打开网页。如果需要自己设置超时时间则:
                通过urlopen()打开网页时使用timeout字段设置
    import urllib.request
    for i in range(1,100):  #循环99次
        try:
            file = urllib.request.urlopen("http://yum.iqianyue.com",timeout=0.1)  #设置超时时间为0.1s
            data = file.read()
            print(len(data))
        except Exception as e:
            print("出现异常:"+str(e))
    #网站服务器性能不好的时候可能出现异常
    一般我们不想出现超时异常就可以把时间设置长一点如:30。
     
    HTTP协议请求实战:
        在客户端和服务器端之间消息传递可以使用http协议请求进行
            http六种类型:
                get请求:通过url地址传递信息。
                post请求:可以向服务器提交数据,比较主流比较安全。
                put请求:请求服务器存储一个资源,通常要指定存储的位置。
                head请求:请求获取报头信息。
                delete请求:请求服务器删除一个资源。
                options请求:获取当前url所支持的请求类型。
    一般使用get和post较多只介绍这两种:
        get请求:
                例如我们想在百度上查询一个关键词,如何用爬虫进行处理呢?
        步骤:首先我们打开百度输入关键词如“xpath”之后回车,我们观察一下url的变化:
    我们分析一下:字段wd是我们查询的值,也就是说wd就是存储用户要检索的关键词
    我们简化下网址  "https://www.baidu.com/s?wd=关键词"
    这时我们把https://www.baidu.com/s?wd=xpath 也加入浏览器刷新一下,也能出现关键词,这说明我们在百度上查询关键词会用get请求进行。
        接着我们实现
                
    import urllib.request
    keywd = "xpath"
    url = "http://www.baidu.com/s?wd=" + keywd
    req = urllib.request.Request(url)
    data = urllib.request.urlopen(req).read()
    fhandle = open("D:/crawler/6.html", "wb")
    fhandle.write(data)
    fhandle.close()
     
     
     
    如果要检索的关键词是中文,则要对上述代码进行优化:
    import urllib.request
     
    # keywd = "xpath"
    keywd="杨守鹤"
    url = "http://www.baidu.com/s?wd=" #注意不是https
    key_code=urllib.request.quote(keywd)#这里对关键词部分进行编码
    url_all=url+key_code
     
     
    req = urllib.request.Request(url_all)#通过url参数构建Request对象
    data = urllib.request.urlopen(req).read()#通过urlopen打开构建的Request对象
    fhandle = open("D:/crawler/7.html", "wb")
    fhandle.write(data)
    fhandle.close()
     
    这里我们学习到满足get请求的url格式:"http://网址?字段名1=字段内容1&字段名2=字段内容2 ..."
     
    post请求
        我们在进行注册登录的时候时常用到post请求
    我们先打开一个网页:http://www.iqianyue.com/mypost/
    输入数据提交后会显示信息。
        如何使用爬虫自动实现呢?
    步骤:
            首先设置url地址,我们分析一下,在点击了提交之后会传递到当前页面进行处理,所以处理的页面应该是:
    http://www.iqianyue.com/mypost/,我们设为url。之后我们在网页右击选择查看页面源代码,找到对应的form表单部分
    ,进行分析。
    <form action="" method="post">
        name:<input name="name" type="text" /><br>
        passwd:<input name="pass" type="text" /><br>
    <input name="" type="submit" value="submit" />
    我们看到属性值
    我们使用字典形式    格式:{字段名1:字段值1,字段名2:字段值2......}
            如:{"name":"yang","pass":"a123456"}
    之后我们还要对数据进行编码处理:使用urllib.parse.urlencode
       然后创建Request对象传入url和数据,接着我们可以使用之前学过的add_header()添加头信息,模拟浏览器爬取。之后就按以往进行处理即可。
    import urllib.request
    import urllib.parse
     
    url = "http://www.iqianyue.com/mypost/"
    postdata=urllib.parse.urlencode({
        "name":"yang",
        "pass":"a123456"
    }).encode('utf-8')#将编码设置为utf-8
    req = urllib.request.Request(url,postdata)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
    data = urllib.request.urlopen(req).read()
    fhandle = open("D:/crawler/8.html", "wb")
    fhandle.write(data)
    fhandle.close()
     
     
     
    代理服务器设置
            有时候使用同一个ip去爬取同一个网站,久了就会被对方服务器屏蔽,怎么办??
            这时我们就要使用一招:"瞒天过海、暗度陈仓",也就是使用代理服务器。
    这里有一个网址:http://yum.iqianyue.com/proxy  里面有更新很多代理ip
    我们选择一个: 格式:"网址:端口号"即:110.52.235.249:9999
    #实现使用代理服务器爬取url网页功能
    def use_proxy(proxy_addr,url):
        import urllib.request
        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="58.219.8.8:1080"
    data=use_proxy(proxy_addr,"http://www.baidu.com")#传递ip和要爬取的url
    print(len(data))#//后续处理
    如果:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>
    说明IP可能失效了,要换一个试试,实际上我们可以实现多个ip用程序实现一个不行自动切换为下一个。
     
     
     
     
     此文是我在学习《精通Python网络爬虫》(韦玮著)的总结,纯手打。
     
  • 相关阅读:
    Sphinx安装配置应用
    错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
    常用Linux命令
    关于安卓开发的学习一:webview
    OpenFirewall
    C#启动或停止 计算机中“服务”
    关于C#操作防火墙,阻止程序联网
    用C#来控制高级安全Windows防火墙
    C#添加删除防火墙例外(程序、端口)
    C#Udp组播
  • 原文地址:https://www.cnblogs.com/yang4869/p/10322946.html
Copyright © 2020-2023  润新知