前言
其实周末就想总结下一些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 ==> 点击查看