1.3、Answer:web crawler question the rest
1.3、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建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)
- 值的有序列表(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'
四、html5-网页表单
1、表单:前后台交互的入口;用户通过表单把数据传送给后台,后台再把数据交给数据库
2、<form> 元素 :<form . . . > <br> </form>,定义 HTML 表单
<form name="" method="" action="" enctype=""> 表单项、文字、图片等 </form>
- 1、name属性:表单的名称
- 1、action(后台接口地址):URL,指定接纳表单数据的 JSP 页面或者Servlet,如果该属性为空则提交给当前页面
- 2、method(请求方式):GET、POST
- 3、enctype (编码方式):‘application/x-www-form-urlencoded’-浏览器就会将参数转换为【查询字符串 qs】格式(默认),'multipart/form-data':当有附件在表单中的时候,enctype需要设置为这种格式
- 4、表单元素指的是不同类型的 input 元素、复选框、单选按钮、提交按钮等
3、<input> 元素:< input type=“text” >,
- 3.1、type
- text 单行文本框
- password 密码框
- submit 提交按钮
- file 附件选择器
- radio 单选按钮
- checkbox 复选按钮
- hidden 隐藏元素
- reset 重置按钮,重设表单内容
- 3.2、name 不能省略 作为参数中的key,如果要正确地被提交,每个输入字段必须设置一个 name 属性
- 3.3、value 作为参数中的 value 在按钮中必须指定value的值
- 3.4、checked 默认选项
- 3.5、placeholder 提示语
4、select属性:一般与option同时出现,标签中的文本显示在网页中,提交的值应该是option的value值,当这个值没有设定的时候,提交的是标签中的文本
<select name="cars"> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <option value="fiat">Fiat</option> <option value="audi">Audi</option> </select>
5、实例
<form action="action_page.php"> First name:<br> <input type="text" name="firstname" value="Mickey"> <br> Last name:<br> <input type="text" name="lastname" value="Mouse"> <br><br> <input type="submit" value="Submit"> </form>
6、<fieldset> 元素:<fieldset> 元素组合表单中的相关数据;<legend> 元素为 <fieldset> 元素定义标题
<form action="action_page.php"> <fieldset> <legend>Personal information:</legend> First name:<br> <input type="text" name="firstname" value="Mickey"> <br> Last name:<br> <input type="text" name="lastname" value="Mouse"> <br><br> <input type="submit" value="Submit"></fieldset> </form>
7、<textarea> 元素:定义多行输入字段(文本域)
<textarea name="message" rows="10" cols="30"> The cat was playing in the garden. </textarea>
8、<button> 元素:<button> 元素定义可点击的按钮
<button type="button" onclick="alert('Hello World!')">Click Me!</button>
. . .