近期忙於找一個暑期實習的公司,無奈個人水平實在太水,合適的公司也不是很多,筆試題目也積累了一些,整理一下好了。
公司 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
代碼如下:
1 # _*_ coding: utf-8 _*_ 2 ''' 3 題目一:編寫一個腳本main.py,使用方式如下: 4 main.py -u http://www.sohu.com -d 'a=1,b=2,c=3' -o /tmp/index.html 5 功能要求:打開-u指定的頁面,將頁面中所有的鏈接后面增加參數a=1&b=2&c=3 6 (需要考慮鏈接中已經存在指定的參數的問題), 然后保存到-o指定的文件中。 7 ''' 8 import urllib2 9 import re 10 import sys,getopt 11 opts, args = getopt.getopt(sys.argv[1:],'hu:d:o:') 12 13 def Tryurlopen(url,d,o): 14 d = getd(d) 15 patterns = re.compile('<a\s(?:.*?\s)*?href=[\'"](.*?)[\'"].*?>') 16 f = urllib2.urlopen(url) 17 contents = f.read() 18 m = re.findall(patterns, contents) 19 file = open(o,'w') 20 for ele in m: 21 #print ele 22 if '&' in ele or '?' in ele: #url后面有參數 23 ele += '&' + d 24 elif ele[-1:] == '/': 25 ele += d 26 else: 27 ele += '/' + d 28 file.writelines(ele + '\n') 29 file.close() 30 31 def getd(d): 32 changeresult = '' 33 dtest = d.split(',') 34 for dele in dtest: 35 changeresult += dele + '&' 36 changeresult = changeresult[:-1] 37 return changeresult 38 39 def main(argv):#利用getop模塊實現基本的命令行參數處理 40 url = '' 41 d = '' 42 orietion = '' 43 for op, value in opts: 44 if op =='-u': 45 url = value 46 elif op == '-d': 47 d = value 48 elif op == '-o': 49 orietion = value 50 51 Tryurlopen(url,d,orietion) 52 53 if __name__ == '__main__': 54 main(sys.argv) 55 56
第二題時間原因我沒有做,只是大體的了解了一下,有興趣的同學可以參考一下的鏈接:
http://blog.csdn.net/jhonguy/article/details/7576155
第三題考察的有基本的I\O操作,對獲得的URL內容的處理,返回的HTTP狀態碼可以分析header解決,以及用多線程讀取同一文件,涉及到了鎖與同步的問題,也沒有特別偏的東西吧,看來公司都是比較注重基礎知識的,唉自己基礎這么不扎實怎么辦,還要繼續努力呀。
代碼如下:
1 # _*_ coding: utf-8 _*_ 2 ''' 3 題目三: 4 有配置文件有類似下面的配置: 5 http://m.sohu.com/c/5/|財經|200 6 http://m.sohu.com/|體育|200 7 http://m.sohu.com/n/346620805/|信號|200 8 9 編寫一個腳本,要求如下: 10 1. 讀取配置文件,對每一個url進行檢查. 11 例如http://m.sohu.com/c/5/, 這個url返回的結果應該包含"財經"兩個字,並且HTTP狀態碼是200, 否則報錯。 12 2. 需支持並行的檢查多個鏈接 13 14 ''' 15 import re 16 import urllib2 17 import threading 18 from os.path import getsize 19 import os,time 20 rlock = threading.RLock() #鎖 21 curPosition = 0 #當前讀取到的文件位置 22 '''設計檢查url的函數(完成)''' 23 def TestUrl(line): 24 25 m = line.split('|') 26 url = m[0] 27 tag = m[1] 28 #print tag 29 f = urllib2.urlopen(url) 30 statuscode = f.getcode() 31 contents = f.read() 32 if tag in contents and statuscode == 200: 33 print 'The url %s is true' %url 34 else: 35 print 'The url %s is wrong.' %url 36 37 38 ''' 設計支持並行連接的程序''' 39 40 class Resource(object): 41 def __init__(self, fileName): 42 self.fileName = fileName 43 #分塊大小 44 self.blockSize = 1000 45 self.getFileSize() 46 #計算文件大小 47 def getFileSize(self): #獲取文件有多少行,即多少個url 48 fstream = open(self.fileName,'r') 49 fstream.seek(0,os.SEEK_END) 50 self.fileSize = fstream.tell() 51 fstream.close() 52 53 class Reader(threading.Thread): 54 def __init__(self, res): 55 self.res = res 56 super(Reader,self).__init__() 57 def run(self): 58 global curPosition 59 fstream = open(self.res.fileName, 'r') 60 while True: 61 #鎖定共享資源 62 rlock.acquire() 63 startPosition = curPosition 64 if (startPosition + self.res.blockSize) < self.res.fileSize: 65 curPosition = endPosition = (startPosition + self.res.blockSize) 66 else: 67 curPosition = endPosition = self.res.fileSize 68 #釋放股共享資源 69 rlock.release() 70 if startPosition == self.res.fileSize: 71 break 72 elif startPosition != 0: 73 fstream.seek(startPosition) 74 fstream.readline() 75 pos = fstream.tell() 76 77 while pos < endPosition: 78 line = fstream.readline() 79 #處理line 80 TestUrl(line) 81 pos = fstream.tell() 82 fstream.close() 83 84 85 86 if __name__ == '__main__': 87 starttime = time.clock() 88 #線程數 89 threadNum = 4 90 #文件 91 fileName = '/Users/gixiaochen/Documents/config.log' 92 res = Resource(fileName) 93 #線程池 94 threads = [] 95 #初始化線程 96 for i in range(threadNum): 97 rdr = Reader(res) 98 threads.append(rdr) 99 #開始線程 100 for i in range(threadNum): 101 threads[i].start() 102 #線程結束 103 for i in range(threadNum): 104 threads[i].join()
找實習的一點感受:
1. 扎實的基礎知識+某一方面的特長才能有好的offer
2. 不管找不找得到,准備工作的同學都應該盡力去找,感覺找實習的時候自己提高的很多,多投幾個公司多筆試面試幾次,就會發現很多自己覺得不重要的東西還是很有必要牢牢掌握的,以前偷懶丟下的東西,以后都要一個個的撿起來。
3. 找實習的渠道很重要,我在微博上找了幾個公司發了郵件去問基本上都收到回復了,時效性比較強。大街網上一堆HR很感興趣的投遞都沒什么反饋,還是要轉變思路吧。