爬《伯乐在线》的python专栏

前言:

  环境:win7系统+python3.4

  作者:羽凡       

  时间:2017-7-25          

  目标:《伯乐在线》python专栏 

  模块: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         

 

posted @ 2017-07-25 11:39  羽化凡  阅读(373)  评论(0编辑  收藏  举报