Answer:web crawler question the rest

Answer:web crawler question the rest

概述

3、python第三方库requests库包含的模块有哪些?==requests库的功能有哪些?requests库是实现这些功能独一无二的吗?如果不是,那requests库与其他库的优势和局限性?怎么将requests库根据自己的需求进行特性定制?

4、浏览器、web客户端、web服务器端的关系和组成?这三者之间的交互式怎么实现的?涉及Ajax技术、html格式文本(动态HTML和静态HTML的区别和关系是什么?)、使用了哪些数据结构来抽象对象,文件管理系统的算法逻辑是怎么样?webdriver是web服务器的组成部分还是浏览器的组成部分亦或者是web客户端?

5、web crawler会有哪些异常,如何处理这些异常?这些异常的产生于前面哪些疑问相关?网络、反crawler居多;而反crawler有涉及html、JavaScript、http等

6、伪随机数和随机数种子如何产生?梅森旋转算法

7、网页表单的组成?web服务器如何根据web客户端提交的网页表单信息对用户进行区别对待(people还是robot)?如何将robot隐藏成people?如何特性定制网页表单?有哪些python第三方库可以实现功能?

8、API是什么?API和web三剑客的关系是如何(父子、朋友)?如何利用API?

一、CSS(Cascading Style Sheets)层叠样式表

1、web浏览器的CSS层实现的功能:添加背景、格式化文本、定义链接表现形式、定义列表、定义表格、格式化盒模型、格式化边框、定义轮廓、定义元素的填充和边距、CSS填充、CSS分组和嵌套、CSS尺寸、CSS显示、CSS定位、CSS浮动、CSS对齐元素、CSS生成的内容、CSS伪类、CSS伪元素、CSS导航栏 、CSS图片廊、CSS图像的不透明度、CSS图像拼合、CSS属性选择器

2、CSS定义如何显示 HTML 元素,样式通常存储在样式表中,<style> 标签在文档头部定义内部样式表:、

<head>
<style>
hr {color:sienna;}
p {margin-left:20px;}
body {background-image:url("images/back40.gif");}
</style>
</head>

3、HTML 4.0 中添加样式表,解决了内容与表现分离的问题

4、外部样式表可以极大提高工作效率,外部样式表通常存储在 CSS 文件(.css)中,文件不能包含任何的 html 标签,多个样式定义可层叠为一个

hr {color:sienna;}
p {margin-left:20px;}
body {background-image:url("/images/back40.gif");}

二、JSON(JavaScript Object Notation) 

1、JSON是一种轻量级的数据传输格式,基本上所有的编程语言都支持JSON数据格式

注1:JSON就是一串字符串 只不过元素会使用特定的符号标注

  • { } 双括号表示对象
  • [ ] 中括号表示数组
  • "" 双引号内是属性或值
  • : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

注2:JSON建构于两种结构:

  1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)
  2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)

2、JSON具有以下这些形式:

1.对象

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔

注:如果键或值是字符串键或值都用双引号引起来,所以上面的代码就是{"name":"json"}

2.数组

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。 

 

值(value)可以是双引号括起来的:字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)这些结构可以嵌套。

 

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

 

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

 

3、使用范例及注意事项

1、JSON要结合Ajax(异步请求)使用,在Java中有很多第三方工具能将一个Java的对象转换成JSON数据格式,比如阿里巴巴开发的fastjson

2、使用范例

一、将一个对象转换成JSON数据

public void getEmpById(HttpServletRequest req, HttpServletResponse resp) {
		//取得业务层实现类对象
		IEmpService service = new EmpServiceImpl();
		//取得要查询的雇员的编号
		Integer empno = Integer.parseInt(req.getParameter("id"));
		//将查询到的数据对象转换成JSON数据
		String json = JSON.toJSONString(service.findEmpById(empno));
		//将JSON数据直接输出给客户端(而不是将数据保存到request内置对象,跳转到JSP,使用EL表达式输出)
		PrintWriter out = null;
		try {
			
			out = resp.getWriter();
			out.print(json);
		} catch (Exception e) {
			e.printStackTrace();
		}
		out.close();
	}

二、将一个list集合转换成JSON数据

@Override
	public Map<String, Object> findAllSplit(String kw, Integer cp, Integer ls) {
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			/*将list集合中的雇员按照职位进行分组,以键值对的形式保存到map集合中,
				key是职位名称,value是该职位下所有雇员的List集合 */
			List<Emp> list = this.empDAO.selectSplitAll(kw, cp, ls);
			//调用分组的方法
			//this.groupByJob(list, map);
			map.put("list", list);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			C3P0Util.close(conn);
		}
		return map;
	}

    public void getEmpList(HttpServletRequest req, HttpServletResponse resp) {
        IEmpService service = new EmpServiceImpl();
        PrintWriter out = null;
        try {
            out=resp.getWriter();
            //将list集合转换成JSON输出
            out.println(JSON.toJSONString(service.findAllSplit("", 1, 100).get("list")));
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

 三、将map数据转换成JSON数据

	@Override
	public Map<String, Object> findAllSplit(String kw, Integer cp, Integer ls) {
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			/*将list集合中的雇员按照职位进行分组,以键值对的形式保存到map集合中,
				key是职位名称,value是该职位下所有雇员的List集合 */
			List<Emp> list = this.empDAO.selectSplitAll(kw, cp, ls);
			//调用分组的方法
			this.groupByJob(list, map);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			C3P0Util.close(conn);
		}
		return map;
	}

        public void getEmpList(HttpServletRequest req, HttpServletResponse resp) {
		IEmpService service = new EmpServiceImpl();
		PrintWriter out = null;
		try {
			out=resp.getWriter();
			//将list集合转换成JSON输出
			out.println(JSON.toJSONString(service.findAllSplit("", 1, 100)));
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

二、API(application programming interface)

1、API也是通过requests请求和服务器端的response来完成API的一次调用的。API 通常返回的是 JSON 格式或 XML 格式的数据

2、API通用规则

2.1、API利用HTTP 从网络服务获取信息有四种方式:GET、POST、PUT、DELETE

注:1、PUT 在网站交互过程中不常用,但是在API 里面有时会用到,PUT 请求用来更新一个对象或信息

  2、API 不需要验证操作(就是说任何人都可以使用API,不需要注册)

  3、API 要求验证操作:1、计算API 调用的费用或者是提供了包月的服务,2、“限制”用户使用API(限制每秒钟、每小时或每天API 调用的次数),3、或者是限  制一部分用户

  4、API 验证的方法都是用类似令牌(token)的方式调用,每次API 调用都会把通过URL链接或者请求头里的cookie将令牌传递到服务器上。这种令牌可能是用  户注册的时候分配给用户,也可能是在用户调用的时候才提供。token可能是长期固定的值后者频繁变化的,通过服务器对用户名和密码的组合处理后生成

 3、Python中通过json库的loads()函数可以把json格式的字符串转换为python对象

import requests
import json


par={'address':'北京','key':'cb649a25c1f81c1451adbeca73623251'}
r=requests.get('http://restapi.amap.com/v3/geocode/geo',par)
r.text

'{"status":"1","info":"OK","infocode":"10000","count":"1","geocodes":[{"formatted_address":"北京市","country":"中国","province":"北京市","citycode":"010","city":"北京市","district":[],"township":[],"neighborhood":{"name":[],"type":[]},"building":{"name":[],"type":[]},"adcode":"110000","street":[],"number":[],"location":"116.407526,39.904030","level":"省"}]}'

json_data=json.loads(r.text)        #转换为python对象
json_data

{'status': '1', 'info': 'OK', 'infocode': '10000', 'count': '1', 'geocodes': [{'formatted_address': '北京市', 'country': '中国', 'province': '北京市', 'citycode': '010', 'city': '北京市', 'district': [], 'township': [], 'neighborhood': {'name': [], 'type': []}, 'building': {'name': [], 'type': []}, 'adcode': '110000', 'street': [], 'number': [], 'location': '116.407526,39.904030', 'level': '省'}]}

# 取北京市的经纬度如下

# json_data['geocodes'][0]['location']

# '116.407526,39.904030'
 

猜你喜欢

转载自www.cnblogs.com/yinminbo/p/12026874.html