


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最简单的爬虫网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 python的 urlliburllib2等模块很容易实现这一功能,下面的例子实现的是对baidu首页的下载。具体代码如下:importurllib2page =( "" )print()提交表单数据(1) 用 GET 方法提交数据提交表单的GET 方法是把表单数据编码至URL 。在给出请示的页面后,加上问号,接着是表单的元素。如在百度中搜索“马伊琍 ”得到url为&pn=100&rn=20&ie=utf-8&usm=4&rsv_pa
2、ge=1。其中?后面为表单元素。wd=%E9%A9%AC%E4%BC%8A%E7%90%8D表示搜索的词是“马伊琍 ”, pn 表示从第 100 条信息所在页开始显示(感觉是这样,我试了几次,当写100时,从其所在页显示,但如果写10 ,就是从第1 页显示), rn=20表示每页显示20 条, ie=utf-8表示编码格式, usm=4没明白是什么意思,换了 1 、2 、3 试了下,没发现什么变化, rsv_page=1表示第几页。如果要下载以上页面比较简单的方法是直接用上面的网址进行提取。如代码:importurllib2keyword=( ' 马伊琍 ' )page =(
3、"" +keyword+"&pn=100&rn=20&ie=utf-8&usm=4&rsv_page=1")print()(2) 用 post 方法提交GET 方法中,数据是被加到URL 上,这种方法数据量要求不大,如果需要交换大量数据的时间, POST 方法是一个很好的方法。这里以前段时间写的博客python 模拟 163 登陆获取邮件列表为例,具体代码不在列出,详见地址:。urllib,urllib2,httplib,mechanize 的介绍模块 ( 引自:urllib 模块提供接口可以使我们像访问本地文件一
4、样来读取www和 ftp 上的数据。模块中最重要的两个函数分别是:urlopen() 和 urlretrieve()。(url, data, proxies) :本函数创建一个表示远程url 的类文件对象, 然后像本地文件一样操作这个类文件对象来获取远程数据。 参数 url表示远程数据的路径,一般是网址;参数data 表示以 post 方式提交到 url 的数据;参数proxies 用于设置代理。 urlopen 返回 一个类文件对象,返回的类文件对象提供了如下方法:read(), readline(), readlines(), fileno(), close():这些方法的使用方式与文件对
5、象完全一样 ;info() :返回一个对象,表示远程服务器返回的头信息;getcode() :返回 Http 状态码。如果是 http 请求, 200 表示请求成功完成 ;404 表示网址未找到;geturl():返回请求的url ;#! /usr/bin/env python#coding=utf-8importurllibcontent=( "")print"http header:",()print"http status:",()print"url:",()print"content:"
6、for linein():printline(url, filename, reporthook, data):urlretrieve方法直接将远程数据下载到本地。参数 filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调(即每下载一块就调用一次回调函数)。我们可以利用这个回调函数来显示当前的下载进度,也可以用于限速,下面的例子会展示。参数data指 post到服务器的数据。该方法返回一个包含两个元素的元组 (filename, headers),
7、 filename表示保存到本地的路径,header表示服务器的响应头。#! /usr/bin/env python# coding: utf-8"""下载文件,并显示下载进度"""importurllibdefDownCall(count,size,total_filesize):"""count为已下载数据块个数,size为数据块的大小,total_filesize为文件总大小"""per=*count*size/total_filesizeifper>100:pe
8、r=100print"Already download %d KB(%.2f"%(count*size/1024,per)+"%)"url=""localfilepath=r "C:UsersAdministratorDesktop"(url,localfilepath,DownCall)urllib 中还提供了一些辅助方法,用于对 url 进行编码、解码。 url 中是不能出现一些特殊的符号的, 有些符号有特殊的用途。 我们知道以 get 方式提交数据的时候, 会在 url 中添加 key=value 这样的字符
9、串,所以在 value 中是不允许有 '=' ,因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码, 还原成原始的数据。这个时候, 这些辅助方法会很有用:(string, safe):对字符串进行编码。参数safe 指定了不需要编码的字符;(string):对字符串进行解码;(string, safe):与类似,但这个方法用'+' 来替换 ' ' ,而 quote用 '%20'来代替''(string):对字符串进行解码;(query, doseq):将 dict或者包含两个元素的元组列表转换成ur
10、l参数。例如 字典'name': 'dark-bull', 'age': 200将被转换为 "name=dark-bull&age=200"(path):将本地路径转换成url 路径;(path):将 url 路径转换成本地路径;urllib2模块 ( 引自:使用 Python 访问网页主要有三种方式:urllib, urllib2, httpliburllib 比较简单,功能相对也比较弱,httplib 简单强大,但好像不支持session(1 )最简单的页面访问res=(url)print ()( 2 )加上要 g
11、et 或 post 的数据data="name":"hank", "passwd":"hjz"(url, (data)( 3 )加上 http 头header="User-Agent": ""(url, (data), header)使用 opener和 handleropener = (handler)(opener)( 4 )加上 sessioncj = ()cjhandler=(cj)opener = (cjhandler)(opener)( 5 )加上 Basic 认
12、证password_mgr = ()top_level_url = ""(None, top_level_url, username, password)handler = (password_mgr)opener = (handler)(opener)(6 ) 使用代理proxy_support = ("http":"")opener = (proxy_support)(opener)(7 ) 设置超时(5)httplib模块(引自:)httplib是python中http协议的客户端实现,可以使用该模块来与HTTP服务器进行交互。
13、 httplib获取 google的内容不是很多,也比较简单。以下是一个非常简单的例子,使用首页的 html :httplib#coding=gbkimporthttplibconn=("")( 'get','/')print().read()()下面详细介绍httplib提供的常用类型和方法。( host , port , strict , timeout )HTTPConnection类的构造函数,表示一次与服务器之间的交互,即请求/ 响应。参数host表示服务器主机, 如:;port为端口号,默认值为80;参数strict的 默认值为f
14、alse,表示在无法解析服务器返回的状态行时( status line)OK),是否抛BadStatusLine异常;可选参数(比较典型的状态行如:timeout表示超时时间。HTTP/ 200HTTPConnection提供的方法:( method , url , body , headers )调用 request方法会向服务器发送一次请求,method表示请求的方法,常用有方法有 get和 post; url表示请求的资源的url; body表示提交到服务器的数据,必须是字符串(如果 method是 "post",则可以把body理解为 html表单中的数据) ;he
15、aders表示请求的http头。()获取 Http响应。返回的对象是HTTPResponse的实例,关于HTTPResponse在下面会讲解。()连接到 Http服务器。()关闭与服务器的连接。( level )设置高度的级别。参数level的默认值为0 ,表示不输出任何调试信息。HTTPResponse表示服务器对客户端请求的响应。往往通过调用()来创建,它有如下方法和属性:(amt)获取响应的消息体。 如果请求的是一个普通的网页,可选参数 amt 表示从响应流中读取指定字节的数据。那么该方法返回的是页面的html。(name, default)获取响应头。 Name情况下作为默认值返回。表
16、示头域(header field)名,可选参数default在头域名不存在的()以列表的形式返回所有的头信息。获取所有的响应头信息。获取服务器所使用的http协议版本。 11 表示 http/; 10 表示 http/。获取响应的状态码。如:200 表示请求成功。返回服务器处理请求的结果说明。一般为”OK”下面通过一个例子来熟悉HTTPResponse中的方法:#coding=gbkimporthttplibconn= ("", 80, False)( 'get','/', headers = "Host" : "
17、;" ,"User-Agent": "Mozilla/(Windows;U; Windows NT ;zh-CN; rv: Gecko/ Firefox/","Accept" :"text/plain")res = ()print'version:',print'reason:',print'status:',print'msg:',print'headers:', ()#html#print 'n' +
18、39;-' * 50 + 'n'#print ()()Httplib模块中还定义了许多常量,如:Httplib. HTTP_PORT的值为80 ,表示默认的端口号为80 ;的值为200 ,表示请求成功返回;Httplib. NOT_FOUND的值为40 表示请求的资源不存在;可以通过查询相关变量的含义,如:Print mechanizemechanize没有找到比较完整的介绍,自己写了一个简单的例子如下。# -*- coding: cp936 -*-import time,string import mechanize,urllibfrom mechanizeimpor
19、t Browserurlname=( ' 马伊琍 ' )br =Browser()(False)#ignore theurlhttp=r''+urlname+response=(urlhttp)filename=''f =open(filename,'w')()()"&pn=10&rn=20&ie=utf-8&usm=4&rsv_page=1"1 、半开放socket利用 shutdown() 函数使 socket 单独的参数,该参数表示了如何关闭双向数据传输变为单向数据
20、传输。shutdown()socket。具体为: 0 表示禁止将来读;1需要一个表示禁止将来写;2 表示禁止将来读和写。2 、timeouts控制超时调用 socket 的 settimeout() 函数,向其传递参数, 表明超时时间设置。 当访问一个 socket ,如果经过了参数设定的时间后,什么都没有发生,则会产生一个异常。例如:当程序运行后,会等待数据传入。在另一终端,利用 telnet 连接 12345 接成功后,显示 “连接来自: * ” ,如果此时 5 秒内,终端未进行输入,系端口。连统会提示连接超时退出。代码如下:# -*- coding: cp936 -*-#tcp 响应服务
21、器importsocket,tracebackhost=''port=12345s =, , 1) (host,port) ( 1)while1 :try:clientsock,clientaddr=()exceptKeyboardInterrupt:raiseexcept:()continue(5 )try:print" 连接来自: " ,()while1 :data=(4096)ifnotlen(data):break(data)("nI get it!n")# t=raw_input('input the word:')# (t)except(KeyboardInterrupt,SystemExit):raiseexcept:print' 连接超时 'passexcept:()try:()exceptKeyboardInterrupt:r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论