1.简述cookie和session的作用以及在爬虫中的使用
无状态http协议:
session:服务器端的状态保持机制,需要想办法在发送请求的时候携带sessionID。
cookies:客户端的状态保持机制,将信息存储在本地,有被劫持的危险;数量和大小有限制。有些状态不适合在服务端保持。
#用于session模拟登陆知乎
import requests
import http.cookiejar
from bs4 import BeautifulSoup
session = requests.Session()
session.cookies = http.cookiejar.LWPCookieJar("cookie")
agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/5.1.2.3000 Chrome/55.0.2883.75 Safari/537.36'
headers = {
"Host": "www.zhihu.com",
"Origin":"https://www.zhihu.com/",
"Referer":"http://www.zhihu.com/",
'User-Agent':agent
}
postdata = {
'password': '*******', #填写密码
'account': '********', #填写帐号
}
response = session.get("https://www.zhihu.com", headers=headers)
soup = BeautifulSoup(response.content, "html.parser")
xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")
postdata['_xsrf'] =xsrf
result = session.post('http://www.zhihu.com/login/email', data=postdata, headers=headers)
session.cookies.save(ignore_discard=True, ignore_expires=True)
#github模拟登陆
import requests
from lxml import html
LOGIN_URL = 'https://github.com/login'
SESSION_URL = 'https://github.com/session'
s = requests.session()
r = s.get(LOGIN_URL)
tree = html.fromstring(r.text)
el = tree.xpath('//input[@name="authenticity_token"]')[0]
authenticity_token = el.attrib['value']
data = {
'commit': 'Sign in',
'utf8': '✓',
'authenticity_token': authenticity_token,
'login': 'orzrd',
'password': 'qwe123!@#'
}
r = s.post(SESSION_URL, data=data)
#维护session
#此部分代码来https://blog.csdn.net/zinczhang/article/details/80234217
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('url')
cookie_list = browser.get_cookies()
for cookie in cookie_list:
cookies[cookie['name']] = cookie['value']
#因为只使用requests发送请求不便于cookie的维护,时间长cookie可能会失效,所以使用requests.session()获取session实例进行cookie维护。
#但是requests只能保持 cookiejar 类型的cookie,而我们手动构建的cookie是dict类型的。所以要把dict转为 cookiejar类型。
cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
session = requests.session()
session.cookies = cookies
2.在视频电话通信中往往使用UDP协议,为什么?
TCP和UDP都是传输层协议,QQ的消息为应用层内容,需要通过传输协议封装传输。
TCP为可靠的面向连接协议,建立TCP连接需要两端三次握手协商(双方在线)。
UDP为不可靠的无连接协议,数据传输出去,无需连接两端,确认是否到达(对端可以不在线)。
QQ采用UDP协议提高了消息传输的效率,无需两端建立连接,即使对端不在线也能传输消息。
3.分别阐述进程、线程、协程的区别和联系
进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
进程和其他两个的区别还是很明显的。
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力
4.scrapy中pipleline的主要作用?
一个是查重并丢弃,第二是将爬取的数据保存在文件或者数据库中
5.描述scrapy进行网页爬取的主要流程?
1、爬虫引擎获得初始请求开始抓取。
2、爬虫引擎开始请求调度程序,并准备对下一次的请求进行抓取。
3、爬虫调度器返回下一个请求给爬虫引擎。
4、引擎请求发送到下载器,通过下载中间件下载网络数据。
5、一旦下载器完成页面下载,将下载结果返回给爬虫引擎。
6、引擎将下载器的响应通过中间件返回给爬虫进行处理。
7、爬虫处理响应,并通过中间件返回处理后的items,以及新的请求给引擎。
8、引擎发送处理后的items到项目管道,然后把处理结果返回给调度器,调度器计划处理下一个请求抓取。
9、重复该过程(继续步骤1),直到爬取完所有的url请求。
6.写出使用正则表达式匹配中国运营商手机号的正则表达式(不含港澳台地区)
^((+86)?(13\d|14[5-9]|15[0-35-9]|166|17[0-8]|18\d|19[8-9])\d{8})$
^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$
7.简要概述python的内存管理机制
一句话概括:引用计数为主,清除标记,分代回收为辅
def log(func):
def wrapper(*args,**kw):
print ('begin call')
func(*args,**kw)
print ('end call')
return wrapper
@log
def f():
print ('this is a app!')