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网络爬虫》(韦玮著)的总结,纯手打。
 

Python爬虫第二天的更多相关文章

  1. python数据挖掘第二篇-爬虫

    python爬虫 urllib用法 eg1: from urllib import request data = request.urlopen(urlString).read() # data获取的 ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看

    马上就要过年啦 过年在家干啥咧 准备好被七大姑八大姨轮番「轰炸」了没? 你的内心 os 是这样的 但实际上你是这样的 应付完之后 闲暇时刻不妨看看电影 接下来咱们就来爬取豆瓣上评分最高的 250部电影 ...

  4. 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)

    一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...

  5. [python]爬虫学习(一)

    要学习Python爬虫,我们要学习的共有以下几点(python2): Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy ...

  6. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  7. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

  8. [python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  9. Python爬虫学习:二、爬虫的初步尝试

    我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...

随机推荐

  1. VGA、DVI、HDMI三种视频信号接口

    目前,电脑显示器常见的接口主要有HDMI.DP.DVI.VGA等4种接口.显示器数据线性能排名:DP>HDMI>DVI>VGA.其中 
VGA是模拟信号,已经被主流所淘汰,DVI.H ...

  2. Linux下定时备份文件

    一. 编写脚本 编写一个脚本文件,使脚本可以执行备份命令. 例如,将文件目录 /home/backups/balalala 备份到/home目录下,并压缩. 1. 创建脚本 命令格式: touch 路 ...

  3. C# Emgu 类型转换

    Bitmap: Bitmap位图文件,是Windows标准格式,也是.Net主要的图像存储格式. Bitmap类以System.Drawing为命名空间,继承抽象类Image,同时里面封装了非常多对图 ...

  4. bounding box的简单理解

    1. 小吐槽 OverFeat是我看的第一篇深度学习目标检测paper,因为它是第一次用深度学习来做定位.目标检测问题.可是,很难懂...那个bounding box写得也太简单了吧.虽然,很努力地想 ...

  5. 【Git】Git提交代码的正确姿势

    按此步骤基本没问题,中间有conflict,需要手动解决. 1.git stash 2.git pull 3.git stash pop 4.git add --xxx 5.git commit -m ...

  6. 键盘keyCode值

    参考地址: https://blog.csdn.net/qq_25835645/article/details/78788987

  7. 有关js获取屏幕宽度问题

    offsetWidth是指包括滚动条的部分,而document.documentElement.clientWidth是去除滚动条的部分,所以这两个值是不一样的.

  8. 函数式编程 - 函数缓存Memoization

    函数式编程风格中有一个"纯函数"的概念,纯函数是一种无副作用的函数,除此之外纯函数还有一个显著的特点:对于同样的输入参数,总是返回同样的结果.在平时的开发过程中,我们也应该尽量把无 ...

  9. (转载)C# 枚举 FlagsAttribute用法

    这是读过几篇文章后发现整理的最完整的一篇文章 转载地址:枚举特性FlagsAttribute的用法 先看官方的解释:指示可以将枚举作为位域(即一组标志)处理. 看起来并不好理解,到底什么是作为位域处理 ...

  10. 理解go的闭包

    package main import ( "fmt" ) func test(a int) { a++ fmt.Println(a) } func test2() func() ...