zoukankan      html  css  js  c++  java
  • python--网络爬虫一

    http://hankjin.blog.163.com/blog/static/3373193720105140583594/

    http://blog.csdn.net/wklken/article/details/7364328

    http://blog.csdn.net/pleasecallmewhy/article/details/8923067

    使用Python访问网页主要有三种方式: urllib, urllib2, httplib:

    urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session

    urllib   http://docs.python.org/library/urllib.html

    urllib2  http://docs.python.org/library/urllib2.html

    httplib   http://docs.python.org/library/httplib.html


    1. 最简单的页面访问

    1 import urllib2
    2 url='http://www.baidu.com/'
    3 res=urllib2.urlopen(url)
    4 page=res.read()
    5 print page

    这个半天显示不了结果~~

    urllib2,urlopen()函数

    urllib2.urlopen(url[, data[, proxies]]) :

    url: 表示远程数据的路径

    data: 以post方式提交到url的数据

    proxies:用于设置代理

    urlopen返回对象提供方法:

    -         read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样

    -         info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息

    -         getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

    -         geturl():返回请求的url

    2. 加上要get或post的数据

    http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

    两种 HTTP 请求方法:GET 和 POST

    在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

    • GET - 从指定的资源请求数据。
    • POST - 向指定的资源提交要被处理的数据
    • GET 方法

      请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

      /test/demo_form.asp?name1=value1&name2=value2
    • POST 方法

      请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

      POST /test/demo_form.asp HTTP/1.1
      Host: w3schools.com
      name1=value1&name2=value2

       post是以Requst对象的形式发出的,get是以字符串的形式发出的

    1. get是从服务器上获取数据,post是向服务器传送数据。
    
    2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
    4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
    5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    建议:
    1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
    2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

    POST方式:

     1 import urllib2
     2 import urllib
     3 url='http://www.baidu.com/'
     4 data=urllib.urlencode({'name':'jon',
     5                        'location':'www',
     6                        'language':'py'})#data-HTML编码标准形式
     7 req=urllib2.Request (url,data)
     8 print req #<urllib2.Request instance at 0x02B85170>(url,data)的Request对象
     9 res=urllib2.urlopen(req)#也可以直接res=urllib2.urlopen(url,data)
    10 print res.read()

    GET方式:

    如果没有传送data参数,urllib2使用GET方式的请求。

     1 import urllib2
     2 import urllib
     3 url='http://www.baidu.com/'
     4 url_values=urllib.urlencode({'name':'jon',
     5                        'location':'www',
     6                        'language':'py'})#data-HTML编码标准形式
     7 print url_values
     8 #name=jon&language=py&location=www
     9 full_url=url+'?'+url_values
    10 res=urllib2.urlopen(full_url)
    11 print res.read()

    结果也和1一样
    3. 加上http头

    有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。

    默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),

    这个身份可能会让站点迷惑,或者干脆不工作。

    浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。

    headers={"User-Agent": 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'#模拟电脑访问,比如糗百网页就必须有这个头

          'Referer': url}

    data={...}#这个一般是需要登录访问的页面,用httpfox抓取发送的POST内容

    req = urllib2.Request(url, urllib.urlencode(data), headers=headers)  

    #hearder也可以这样添加: req.add_header('User-Agent')

    response = urllib2.urlopen(req)

    最好是转化为Request对象

    4 异常检查

    得到 HTTP 的返回码

    对于 200 OK 来说,只要使用 urlopen 返回的 response 对象的 getcode() 方法就可以得到 HTTP 的返回码。但对其它返回码来说,urlopen 会抛出异常。这时候,就要检查异常对象的 code 属性了。HTTP ,返回200正常,404错误

    不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。
    HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

    except urllib2.HTTPError,e:print e.code

    except urllib2.URLError,e:print e.reason

    5

  • 相关阅读:
    获取JVM的dump文件
    jmeter正则表达式提取器提取特定字符串后的全部内容
    mysql数据库开启慢查询日志
    正则中需要转义的特殊字符
    LoadRunner 调用Dll完成加密解密
    压缩十进制数据的一次实践
    记Judith此人和我对美国教育的感触
    在 sql server 中,不允许用户查看到所有数据库
    在 asp.net core 中使用 HttpContext.Current
    nginx 配置将某站点所有页面指向一个路径
  • 原文地址:https://www.cnblogs.com/fkissx/p/3735694.html
Copyright © 2011-2022 走看看