您的位置:首页 > 编程语言 > Python开发

【实习】暑期实习之python笔试题(一)

2013-04-16 15:30 316 查看
近期忙于找一个暑期实习的公司,无奈个人水平实在太水,合适的公司也不是很多,笔试题目也积累了一些,整理一下好了。

公司 A

题目一:编写一个脚本main.py,使用方式如下:

main.py -u http://www.sohu.com -d 'a=1,b=2,c=3' -o /tmp/index.html

功能要求:打开-u指定的页面,将页面中所有的链接后面增加参数a=1&b=2&c=3(需要考虑链接中已经存在指定的参数的问题), 然后保存到-o指定的文件中。

题目二:编写一个 ab(Apache Benchmark)的替代程序,请尽可能的兼容 ab 你所认为重要的功能和参数。

题目三:

有配置文件有类似下面的配置:

http://m.sohu.com/c/5/|财经|200

http://m.sohu.com/|体育|200

http://m.sohu.com/n/346620805/|信号|200

编写一个脚本,要求如下:

1. 读取配置文件,对每一个url进行检查.

例如http://m.sohu.com/c/5/, 这个url返回的结果应该包含"财经"两个字,并且HTTP状态码是200, 否则报错。

2. 需支持并行的检查多个链接

Solutions:

我选做的是第一题和第三题。

第一题不难,主要解决的是打开某个url并遍历其中的所有链接,以前写爬虫的时候搞过这些东西就比较简单了,同时也涉及到了基本的I/O操作,考的还是比较基本的吧。比较生疏的是命令行参数问题,平时用的比较多但是自己貌似没实现过,趁这个机会也看了一下有关的问题,不过鉴于问题比较简单我就用了getopt解决了,其实有可以实现更加复杂的命令行参数的方法的。

有关的连接可以看一下这里: http://blog.csdn.net/jiang1013nan/article/details/5854378
代码如下:

# _*_ coding: utf-8 _*_
'''
题目一:编写一个脚本main.py,使用方式如下:
main.py -u http://www.sohu.com -d 'a=1,b=2,c=3' -o /tmp/index.html
功能要求:打开-u指定的页面,将页面中所有的链接后面增加参数a=1&b=2&c=3
(需要考虑链接中已经存在指定的参数的问题), 然后保存到-o指定的文件中。
'''
import urllib2
import re
import sys,getopt
opts, args = getopt.getopt(sys.argv[1:],'hu:d:o:')

def Tryurlopen(url,d,o):
d = getd(d)
patterns = re.compile('<a\s(?:.*?\s)*?href=[\'"](.*?)[\'"].*?>')
f = urllib2.urlopen(url)
contents = f.read()
m = re.findall(patterns, contents)
file = open(o,'w')
for ele in m:
#print ele
if '&' in ele or '?' in ele: #url后面有参数
ele += '&' + d
elif ele[-1:] == '/':
ele += d
else:
ele += '/' + d
file.writelines(ele + '\n')
file.close()

def getd(d):
changeresult = ''
dtest = d.split(',')
for dele in dtest:
changeresult += dele + '&'
changeresult = changeresult[:-1]
return changeresult

def main(argv):#利用getop模块实现基本的命令行参数处理
url = ''
d = ''
orietion = ''
for op, value in opts:
if op =='-u':
url = value
elif op == '-d':
d = value
elif op == '-o':
orietion = value

Tryurlopen(url,d,orietion)

if __name__ == '__main__':
main(sys.argv)


第二题时间原因我没有做,只是大体的了解了一下,有兴趣的同学可以参考一下的链接:
http://blog.csdn.net/jhonguy/article/details/7576155
第三题考察的有基本的I\O操作,对获得的URL内容的处理,返回的HTTP状态码可以分析header解决,以及用多线程读取同一文件,涉及到了锁与同步的问题,也没有特别偏的东西吧,看来公司都是比较注重基础知识的,唉自己基础这么不扎实怎么办,还要继续努力呀。

代码如下:

# _*_ coding: utf-8 _*_
'''
题目三:
有配置文件有类似下面的配置: http://m.sohu.com/c/5/|财经|200 http://m.sohu.com/|体育|200 http://m.sohu.com/n/346620805/|信号|200 
编写一个脚本,要求如下:
1. 读取配置文件,对每一个url进行检查.
例如http://m.sohu.com/c/5/, 这个url返回的结果应该包含"财经"两个字,并且HTTP状态码是200, 否则报错。
2. 需支持并行的检查多个链接

'''
import re
import urllib2
import threading
from os.path import getsize
import os,time
rlock = threading.RLock() #锁
curPosition = 0 #当前读取到的文件位置
'''设计检查url的函数(完成)'''
def TestUrl(line):

m = line.split('|')
url = m[0]
tag = m[1]
#print  tag
f = urllib2.urlopen(url)
statuscode = f.getcode()
contents = f.read()
if tag in contents and statuscode == 200:
print 'The url %s is true'   %url
else:
print 'The url %s is wrong.' %url

''' 设计支持并行连接的程序'''

class Resource(object):
def __init__(self, fileName):
self.fileName = fileName
#分块大小
self.blockSize = 1000
self.getFileSize()
#计算文件大小
def getFileSize(self): #获取文件有多少行,即多少个url
fstream = open(self.fileName,'r')
fstream.seek(0,os.SEEK_END)
self.fileSize = fstream.tell()
fstream.close()

class Reader(threading.Thread):
def __init__(self, res):
self.res = res
super(Reader,self).__init__()
def run(self):
global curPosition
fstream = open(self.res.fileName, 'r')
while True:
#锁定共享资源
rlock.acquire()
startPosition = curPosition
if (startPosition + self.res.blockSize) < self.res.fileSize:
curPosition = endPosition = (startPosition + self.res.blockSize)
else:
curPosition = endPosition = self.res.fileSize
#释放股共享资源
rlock.release()
if startPosition == self.res.fileSize:
break
elif startPosition != 0:
fstream.seek(startPosition)
fstream.readline()
pos = fstream.tell()

while pos < endPosition:
line = fstream.readline()
#处理line
TestUrl(line)
pos = fstream.tell()
fstream.close()

if __name__ == '__main__':
starttime = time.clock()
#线程数
threadNum = 4
#文件
fileName = '/Users/gixiaochen/Documents/config.log'
res = Resource(fileName)
#线程池
threads = []
#初始化线程
for i in range(threadNum):
rdr = Reader(res)
threads.append(rdr)
#开始线程
for i in range(threadNum):
threads[i].start()
#线程结束
for i in range(threadNum):
threads[i].join()


找实习的一点感受:

1. 扎实的基础知识+某一方面的特长才能有好的offer

2. 不管找不找得到,准备工作的同学都应该尽力去找,感觉找实习的时候自己提高的很多,多投几个公司多笔试面试几次,就会发现很多自己觉得不重要的东西还是很有必要牢牢掌握的,以前偷懒丢下的东西,以后都要一个个的捡起来。

3. 找实习的渠道很重要,我在微博上找了几个公司发了邮件去问基本上都收到回复了,时效性比较强。大街网上一堆HR很感兴趣的投递都没什么反馈,还是要转变思路吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: