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

  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/fkissx/p/3735694.html
Copyright © 2011-2022 走看看