Startup News爬虫

前言

  其实周末就想总结下一些Python爬虫的技巧,但是最近几天一直忙着,没来得及写博客记录下来。今天就写写关于自己爬虫的固定代码模式,下面就用伪代码模拟下爬虫队列的模式,并以爬Starup News为例。

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
resource = [] #用于存储爬虫到的资源(当然仅限与文本文字)
vistedUrl = [] #用于记录已爬虫过的url地址
spiderUrl = [] #即将会爬虫的url地址
def spider(url): #指定url让爬虫器去抓资源
vistedUrl.append(url) #添加url到爬虫过的列表
··· #资源获取
isOver = False if variable == value else True #结束标识,特征值描述是否有下一个资源
if not isOver:
nextUrl = baseUrl + a.attr('href') #下一个爬虫的地址
spiderUrl.append(nextUrl) #添加到爬虫列表

if __name__ == '__main__':
spiderUrl.append('http://news.dbanotes.net/') #爬虫首页
while spiderUrl: #循环爬虫
spider(spiderUrl.pop())
··· #爬虫结束后,资源处理
··· #资源存储

根据以上的伪代码,对Starup News编写爬虫,并将资源输出成html格式文件。

爬虫代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*-coding: utf-8 -*-
from pyquery import PyQuery as py
import re
import os
article = []
vistedUrl = []
spiderUrl = []

def spider(url):
vistedUrl.append(url)
# 第一次访问
d = py(url,encoding='utf-8')
baseUrl = re.match(r'https?:/{2}(\w+\.?)+',url).group()
# news标题和链接
d('#nil').parents('tr').each(getAritcle)
a = d('.title:last').find('a')
isOver = False if a.text() == "More" else True
if not isOver:
nextUrl = baseUrl + a.attr('href')
spiderUrl.append(nextUrl)

def getAritcle(i,e):
td = py(e).find('td')
a = py(e).find('a').eq(1)
if td.size() == 3:
article.append((td.text(),a.attr('href')))

if __name__ == '__main__':
spiderUrl.append('http://news.dbanotes.net/')
while spiderUrl:
spider(spiderUrl.pop())

# 输出所有文章
filePath = os.path.join(os.path.abspath('.'),'startupnews.html')
with open(filePath,'w',encoding='utf-8') as file:
file.write(r'<!DOCTYPE html>' + '\n')
file.write(r'<html lang="en">' + '\n')
file.write(r'<head>' + '\n')
file.write(r' <meta charset="UTF-8">' + '\n')
file.write(r' <title>Startup News</title>' + '\n')
file.write(r' <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css" />' + '\n')
file.write(r' <script src="//cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>' + '\n')
file.write(r' <script src="//cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>' + '\n')
file.write(r' <style type="text/css">' + '\n')
file.write(r' a{' + '\n')
file.write(r' display: block;' + '\n')
file.write(r' margin-bottom: 10px;' + '\n')
file.write(r' font-size: 18px;' + '\n')
file.write(r' }' + '\n')
file.write(r' </style>' + '\n')
file.write(r' ' + '\n')
file.write(r'</head>' + '\n')
file.write(r'<body>' + '\n')
file.write(r' <div class="container">' + '\n')
file.write(r' <div class="row">' + '\n')
file.write(r' <div class="col-md-6">' + '\n')
file.write(r' <h2>Startup News</h2>' + '\n')
file.write(r' </div>' + '\n')
file.write(r' </div>' + '\n')
file.write(r' <div class="row">' + '\n')
file.write(r' <div class="col-md-12">' + '\n')
for link in article:
href = link[1]
if link[1][0:4] != 'http':
href = vistedUrl[0] + link[1] # 首页+相对地址
file.write(r' <a href="' + href + '" target="_blank">' + link[0] +'</a>' + '\n')

file.write(r' </div>' + '\n')
file.write(r' </div>' + '\n')
file.write(r' </div>' + '\n')
file.write(r'</body>' + '\n')
file.write(r'</html>' + '\n')
print('运行结束!')
print('具体详情:请查看目录下startupnews.html!')

运行结果

  Startup News ==> 点击查看

评论