python 练习题

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!')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值