1.字典排序
按照value值大小排序
>>> d = {'75': '8', '12': '9', '14': '3', '88': '14', '60': '14', '61': '13', '62': '8', '63': '9', '64': '10', '65': '9', '7': '13', '9': '11', '8': '11'}
>>> sorted(d.items(), key = lambda x:int(x[1]))[('14', '3'), ('75', '8'), ('62', '8'), ('63', '9'), ('65', '9'), ('12', '9'), ('64', '10'), ('9', '11'), ('8', '11'), ('61', '13'), ('7', '13'), ('88', '14'), ('60', '14')]
2.xshell
screen -D -r 窗口名 # 进入attach状态下的screen
rz -be # 可以传输大的文件
sz -y # 可以不用删除已有文件上传重名文件(覆盖源文件)
3.cookie与session
cookie和session都是用来跟踪浏览器用户身份的会话方式。由于HTTP协议是无状态的(每一次请求都是独立的,协议对于事物处理没有记忆能力),为解决该问题出现了cookie和session。cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
cookie信息保存在浏览器(客户端)中;
cookie由服务器产生,浏览器收到请求后保存到本地,当浏览器再次向服务器发出请求时,会带上cookie,这时服务器就能知道当前发出请求的是“谁”了;
但由于cookie保存在客户端本地,所以安全性低,很容易被查看和破解;
cookie分两类:
会话cookie:没有设置过期时间,保存在浏览器的内存中,关闭浏览器,cookie会被销毁
普通cookie:设置了过期时间,保存在硬盘上
session信息(用户信息、登录状态等)保存在服务器端;
session信息因为保存在服务器端,不会像cookie一样在发送请求时候被拦截,所以有较高的安全性,而且session可以支持更多的字节,保存更多的东西。
使用Python中的requests模块的session对象,可以跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies不同的客户端在向服务器发送请求时,服务器都会先检查请求中有没有session标识(也就是session id),如果包含则说明服务器为该客户端创建过session,然后就可以通过session id找到该客户端相关的session信息(这样在登录的时候就不用每次都发送一堆信息给服务器了);如果客户端是第一次与服务器建立连接,服务器会为客户端创建一个session,并分配一个与之关联的session id,通常客户端保存这个session id的方式就是使用cookie了。
在爬虫中的应用:
a、某些请求中需要带有特定的cookie值才能进行正常访问;
b、需要登录才能抓取数据的时候,最好使用session,因为复杂一些的登录过程,会发生多次跳转,每次跳转都会在本地执行不同的set-cookies操作,使用session就可以保存这些cookie信息。
参考链接:http://justsee.iteye.com/blog/1570652
4.常用的字符串方法
这里只是列举一下我常用到的方法:
replace,strip,lstrip,rstrip,lower,upper,title,count,endswith,startswith,find,rfind,index,split,join。
具体可以参考这篇文章:python字符串(string)方法整理
5.python装饰器
装饰器作用:
引入日志、函数执行时间统计、执行函数前预备处理、执行函数后的清理功能、权限校验等场景和缓存等。
6.HTTP请求中的GET和POST
get请求用于信息获取,从服务器上获取数据;
post请求一般用于修改服务器上的资源,所以post是向服务器传送数据;
get请求也可以传送数据,但是get方式提交的数据有长度限制,最多1024个字节;使用get请求提交的数据(参数)是通过url提交的,是可见的,容易暴露,所以安全性低;post请求提交的数据是放在header中,不可见,安全性相对较高。
当然,在数据未加密情况下,两个请求的安全级别其实是一样的,任何一种监听器都能把所有数据监听到。
7.什么是lambda函数?使用它的好处?
匿名函数,可以快速定义的单行的最小函数。
好处是轻便,适合需要完成某一项简单功能。
8.GIL
Global Interpreter Lock(全局解释器锁)。
Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行(每个线程在执行前都需要先获取GIL,即保证同一时刻只有一个线程对共享资源进行存取)。
但是也正是因为GIL,我们在使用多线程的时候只能实现并发,却不能实现并行。
并发:交替处理多个任务(吃饭的时候,来了一个电话,停止吃饭接电话,接电话后才继续吃饭);
并行:同时处理多个任务(吃饭的时候,来了一个电话,边吃饭边打电话);
什么情况下线程会释放GIL:线程遇到I/O阻塞时,会释放GIL,给另一个线程执行的机会。
所以对于多核CPU,使用多进程才能更好的利用CPU资源。当然,多线程爬取肯定还是会比单线程爬取效率更高,因为遇到I/O阻塞时会自动释放GIL锁。
9.yield关键字
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
10.scrapy
scrapy是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程, twisted的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取 100个网站,并发及分布式处理方面,不够灵活,不便调整与括展。
优点:scrapy 是异步的、采取可读性更强的xpath代替正则、强大的统计和log系统、同时在不同的url上爬行、支持shell方式,方便独立调试、写middleware,方便写一些统一的过滤器、通过管道的方式存入数据库。
缺点:基于python的爬虫框架,扩展性比较差、基于twisted框架,运行中的exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。
scrapy框架运行的机制:从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:1. 如果提取出需要的数据,则交给管道文件处理;2. 如果提取出url,则继续执行之前的步骤(发送url请求,并由引擎将请求交给调度器入队列...),直到请求队列里没有请求,程序结束。
11.常见的反爬虫
通过headers反爬虫、基于用户行为反爬虫(限制同一ip的请求次数)、动态页面的反爬虫(ajax--异步的js和xml数据)
12.分布式爬虫主要解决什么问题
ip、带宽、cpu、io
13.HTTP状态码
14.使用xpath表达式如何通过文本内容定位HTML标签
以“https://www.zhihu.com/”为例,寻找文本内容为“登录”的HTML标签的xpath表达式就是://span[contains(text(), '登录')]
网友评论