前言:
环境:win7系统+python3.4
作者:羽凡
时间:2017-7-25
模块:urllib,re,time,xlsxwriter
问题:在找感兴趣的python项目时,老是要不停的下一页,嫌麻烦。
功能:通过选择该专栏的“观点与动态”。。。。“工具与框架”来获取文章的标题及信息,导入excel直接在Excel中浏览,点击感兴趣的链接。
实践测试及分析:
爬虫入口(初始Url):url_one = 'http://python.jobbole.com/'
首页就是上述url跳过,“所有文章”是后面栏目的综合,跳过。接下来是各个专栏,分别点选,观察url变化如下;
1.观点与动态:http://python.jobbole.com/category/news/
2.基础知识:http://python.jobbole.com/category/basic/
3.系列教程:http://python.jobbole.com/category/guide/
4.实践项目:http://python.jobbole.com/category/project/
5.工具与框架:http://python.jobbole.com/category/tools/
可以看到只是后面发生变化,可以创建字典来进行选择,然后构造第二级Url:url_two = url_one + select
以上第二级url是该专栏第一页,当跳到第二页时,会有些变化:如http://python.jobbole.com/category/tools/page/2/
中间出现page段,可以测试http://python.jobbole.com/category/tools/page/1/会重定向到第一页,所以构造第三级url可以统一如下:
url_three = url_two + 'page/' + page
其中的page要通过正则表达式在url_two中寻找,接着通过urllib模块获取链接内容,用正则获取该内容中的文章标题和链接。
以上有用到while循环选择专栏和for循环获取信息并导入Excel。
完整代码:
1 ''' 2 2017-7-25 by:羽凡 3 4 win7 + python3.4 5 6 ''' 7 8 import urllib.request 9 import re 10 import xlsxwriter 11 import time 12 13 url = 'http://python.jobbole.com/category/' 14 dic = {'1':'news','2':'basic','3':'guide','4':'project','5':'tools'} 15 workbook = xlsxwriter.Workbook('伯乐在线之python.xlsx') 16 while 1: 17 print(''' 18 ---------------伯乐在线之python开发------------------- 19 1:观点与动态 20 2:基础知识 21 3:系列教程 22 4:实践项目 23 5:工具和框架 24 ''') 25 select = input('选择栏目(数字)或退出(Q):') 26 if select == 'Q': 27 break 28 try: 29 worksheet = workbook.add_worksheet(dic[select]) 30 except: 31 print("已重复或错误输入,请重新选择") 32 continue 33 worksheet.set_column('A:A',20) 34 worksheet.set_column('B:B',60) 35 worksheet.set_column('C:C',80) 36 bold = workbook.add_format({'bold':True}) 37 worksheet.write('A1','编号',bold) 38 worksheet.write('B1','文章',bold) 39 worksheet.write('C1','链接',bold) 40 k = 0 41 url_one = url + dic[select] + '/' 42 print(url_one) 43 req = urllib.request.Request(url_one) 44 req.add_header('User-Agent','Mozilla/5.0') 45 data = urllib.request.urlopen(req).read().decode() 46 string = "<a class='page-numbers' href='http://python.jobbole.com/category/.*?'>(.*?)</a>" 47 res_page = re.findall(string,data,re.S) 48 all_page = int(res_page[-1]) 49 print('该专栏共有%d页'%all_page) 50 for page in range(1,all_page): 51 url_page = url_one + 'page/' + str(page) 52 print(url_page) 53 req_page = urllib.request.urlopen(url_page) 54 data_page = req_page.read().decode() 55 reg_page = re.compile('<a target="_blank" class="archive-title" href="(.*?)" title="(.*?)">') 56 res_page = re.findall(reg_page,data_page) 57 for n,m in enumerate(res_page): 58 worksheet.write('A'+str(k+n+2),str(k+n+1)) 59 worksheet.write('B'+str(k+n+2),m[1]) 60 worksheet.write('C'+str(k+n+2),m[0]) 61 print(str(k+n+1)) 62 k = k + n 63 time.sleep(5) 64 workbook.close() 65 print('Ok..') 66