Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存       

爬取博客园指定用户的文章修饰后全部保存到本地

首先定义爬取的模块文件:

  1. crawlers_main.py 执行入口
  2. url_manager.py url管理器
  3. download_manager.py 下载模块
  4. parser_manager.py html解析器(解析html需要利用的内容)
  5. output_manager.py 输出html网页全部内容文件(包括css,png,js等)

crawlers_main.py 执行入口

 1 # coding:utf8
 2 from com.crawlers import download_manager
 3 from com.crawlers import output_manager
 4 from com.crawlers import parser_manager
 5 from com.crawlers import url_manager
 6
 7
 8 class SpiderMain(object):
 9     def __init__(self):
10         self.urls = url_manager.UrlManager()
11         self.downloader = download_manager.DownloadManager()
12         self.parser = parser_manager.ParserManager()
13         self.output = output_manager.OutputManager()
14
15     def craw(self, root_url):
16         html_root = self.downloader.download(root_url)
17         new_urls = self.parser.parseUrls(root_url,html_root)
18         self.urls.add_new_urls(new_urls)
19         count = 1
20         while self.urls.has_new_url():
21             try:
22                 new_url = self.urls.get_new_url()
23                 print(‘craw %d : %s‘ % (count, new_url))
24                 html_cont = self.downloader.download(new_url)
25                 new_data = self.parser.parse(new_url, html_cont)
26                 self.output.collect_data(new_data)
27                 if count == 1000:
28                     break
29                 count += 1
30             except:
31                 print(‘craw failed‘)
32
33         self.output.output_html()
34
35
36 if __name__ == "__main__":
37     root_url = "http://www.cnblogs.com/zhuyuliang/"
38     obj_spider = SpiderMain()
39     obj_spider.craw(root_url)

crawlers_main.py

url_manager.py url管理器

 1 # coding:utf8
 2 class UrlManager(object):
 3
 4     def __init__(self):
 5         self.new_urls = set()
 6         self.old_urls = set()
 7
 8     def add_new_url(self, url):
 9         if url is None:
10             return
11         if url not in self.new_urls and url not in self.old_urls:
12             self.new_urls.add(url)
13
14     def add_new_urls(self, urls):
15         if urls is None or len(urls) == 0:
16             return
17         for url in urls:
18             self.add_new_url(url)
19
20     def has_new_url(self):
21         return len(self.new_urls) != 0
22
23     def get_new_url(self):
24         new_url = self.new_urls.pop()
25         self.old_urls.add(new_url)
26         return new_url

url_manager.py

download_manager.py 下载模块

 1 # coding:utf8
 2 import urllib2
 3
 4
 5 class DownloadManager(object):
 6
 7     def download(self, url):
 8         if url is None:
 9             return None
10         response = urllib2.urlopen(url)
11         if response.code != 200:
12             return None
13         return response.read()

download_main.py

parser_manager.py html解析器(解析html需要利用的内容)

 1 # coding:utf8
 2 import re
 3 from HTMLParser import HTMLParser
 4
 5 from bs4 import BeautifulSoup
 6 import urlparse
 7
 8 import sys
 9 reload(sys)
10 sys.setdefaultencoding(‘utf-8‘)
11
12 class ParserManager(HTMLParser):
13
14     def __init__(self):
15         HTMLParser.__init__(self)
16         self.links = []
17
18     def handle_starttag(self, tag, attrs):
19         # print "Encountered the beginning of a %s tag" % tag
20         if tag == ‘img‘ or tag == "script":
21             for (variable, value) in attrs:
22                 if variable == "src" or variable == "href":
23                     self.links.append(value)
24         if tag == "link":
25             dic = dict(attrs)
26             if dic[‘rel‘] == "stylesheet":
27                 self.links.append(dic[‘href‘])
28
29     def parse(self, page_url, html_cont):
30             if page_url is None or html_cont is None:
31                 return
32             soup = BeautifulSoup(html_cont,‘html.parser‘,from_encoding=‘utf-8‘)
33             new_data = self._get_new_data(page_url,soup)
34             return new_data
35
36     def _get_new_urls(self, page_url, soup):
37         new_urls = set()
38         #href="http://www.cnblogs.com/zhuyuliang/p/5218635.html"
39         links = soup.find_all(‘a‘,href=re.compile(r‘http://www.cnblogs.com/zhuyuliang/p/...‘))
40         for link in links:
41             new_url = link[‘href‘]
42             new_full_url = urlparse.urljoin(page_url,new_url)
43             new_urls.add(new_full_url)
44         return new_urls
45
46     def _get_new_data(self, page_url, soup):
47         res_data = {}
48         res_data[‘url‘] = page_url
49
50         #<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/zhuyuliang/p/5218635.html">Android开发代码规范</a>
51         title_node = soup.find(‘a‘,class_=‘postTitle2‘)
52         res_data[‘title‘] = title_node.get_text()
53
54         #div id=‘topics‘
55         summary_node = soup.find(‘div‘,class_="post")
56         res_data[‘summary‘] = summary_node
57
58         new_tag = soup.new_tag("body")
59         new_tag.string = summary_node.encode(‘utf-8‘)
60         soup.body.replace_with(new_tag)
61         res_data[‘template‘] = soup
62
63         return res_data
64
65     def parseUrls(self,root_url,html_cont):
66         soup = BeautifulSoup(html_cont, ‘html.parser‘, from_encoding=‘utf-8‘)
67         new_urls = self._get_new_urls(root_url, soup)
68         return new_urls

parser_manager.py

output_manager.py 输出html网页全部内容文件(包括css,png,js等)

 1 # -*- coding:utf-8 -*-
 2 # !/bin/sh
 3 import os
 4 import urllib
 5 from com.crawlers.parser_manager import ParserManager
 6
 7
 8 class OutputManager(object):
 9
10     def __init__(self):
11         self.datas = []
12
13     def collect_data(self, data):
14         if data is None:
15             return
16         self.datas.append(data)
17
18
19     def output_html(self):
20         for data in self.datas:
21             fout = open(‘output/%s.txt‘%data[‘title‘].encode(‘utf-8‘), ‘w‘)
22             fout.write("%s" % data[‘summary‘].encode(‘utf-8‘))
23             fout.close()
24             url = data[‘url‘].encode(‘utf-8‘)
25             pagename = data[‘title‘].encode(‘utf-8‘)
26             # html_code = urllib.urlopen(url).read()
27             hp = ParserManager()
28             html_code = data[‘template‘].encode(‘utf-8‘)
29             html_code = hp.unescape(html_code)
30             hp.feed(html_code)
31             hp.close()
32             durl = url.rsplit(‘/‘,1)[0]
33             self.download(pagename,html_code,durl,hp.links)
34
35
36     def download(self,pagename,html_code,durl,links):
37         if not os.path.exists(‘output/‘+pagename+‘_files‘):
38             os.mkdir(‘output/‘+pagename+‘_files‘)
39             upurl = durl.rsplit(‘/‘,1)[0]
40             for link in links:
41                 fname = link.split(‘/‘)[-1]
42                 fname = fname.split(‘?‘)[0]
43                 localpath = ‘%s%s‘ % (‘output/‘+pagename+‘_files/‘,fname)
44                 replacelocalpath = ‘%s%s‘ % (pagename + ‘_files/‘, fname)
45                 # if link[0:3] == ‘../‘:
46                 #         downlink = "http:" + link
47                 # else:
48                 #         downlink = link
49                 try:
50                     urllib.urlretrieve("http://www.cnblogs.com" + link,localpath)
51                 except Exception,error:
52                     print ‘download error:‘, error
53                 else:
54                     print ‘download ‘+fname
55                     html_code = html_code.replace(link,replacelocalpath)
56                 open(‘output/‘+pagename+‘.html‘,‘w‘).write(html_code)
57         return True

output_manager.py

最后输出:

>结束

时间: 2024-12-20 07:00:47

Python爬虫爬取博客园并保存的相关文章

java爬虫爬取博客园数据

网络爬虫 编辑 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler).聚焦网络爬虫(Focused Web Crawler).增量式网络爬虫(Incremental Web Crawler).深层网络爬虫(Deep We

Python+webdriver爬取博客园“我的闪存”并保存到本地

前篇 用webdriver+phantomjs实现无浏览器的自动化过程 本篇 想法与实现 我想要将博客园“我的闪存”部分内容爬取备份到本地文件,用到了WebDriver和Phantomjs的无界面浏览器.对于xpath的获取与校验需要用到firefox浏览器,安装firebug和firepath插件.代码如下: # -*- coding: utf-8 -*- import os,time from selenium import webdriver from selenium.webdriver

简单爬虫-抓取博客园文章列表

原文:简单爬虫-抓取博客园文章列表 如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了.爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方. 大部分使用httpRequst就能完成,不管是否添加了口令.随即码.请求参数.提交方式get或者post.地址来源.多次响应等等.但是有些网站使用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即

爬虫实战【1】使用python爬取博客园的某一篇文章

第一次实战,我们以博客园为例. Cnblog是典型的静态网页,通过查看博文的源代码,可以看出很少js代码,连css代码也比较简单,很适合爬虫初学者来练习. 博客园的栗子,我们的目标是获取某个博主的所有博文,今天先将第一步. 第一步:已知某一篇文章的url,如何获取正文? 举个栗子,我们参考'农民伯伯'的博客文章吧,哈哈.他是我关注的一个博主. http://www.cnblogs.com/over140/p/4440137.html 这是他的一篇名为"[读书笔记]长尾理论"的文章. 我

Python - 爬取博客园某一目录下的随笔 - 保存为docx

1 #coding:utf-8 2 import requests 3 from bs4 import BeautifulSoup 4 import MySQLdb 5 6 7 def get_html(url): 8 ''' 9 获取页面HTML源码,并返回 10 ''' 11 html = requests.get(url) 12 content = html.text.encode('utf-8') 13 return content 14 15 def get_blog_html_lis

【Python3 爬虫】爬取博客园首页所有文章

首先,我们确定博客园首页地址为:https://www.cnblogs.com/ 我们打开可以看到有各种各样的文章在首页,如下图: 我们以上图标记的文章为例子吧!打开网页源码,搜索Docker,搜索结果如下图: 从上图后红色标记部分可以看出,我们使用正则表达式即可匹配该网址,我们匹配到该网址之后,将该网址对应的内容下载到到底进行存储. 实现代码 import urllib.request import re """ 爬取cnblogs首页所有的文章 ""&

nodejs爬取博客园的博文

其实写这篇文章,我是很忐忑的,因为爬取的内容就是博客园的,万一哪个顽皮的小伙伴拿去干坏事,我岂不成共犯了? 好了,进入主题. 首先,爬虫需要用到的模块有: express ejs superagent (nodejs里一个非常方便的客户端请求代理模块) cheerio (nodejs版的jQuery) 前台布局使用bootstrap 分页插件使用 twbsPagination.js 完整的爬虫代码,在我的github中可以下载.主要的逻辑代码在 router.js 中. 1. 爬取某个栏目第1页

webmagic爬取博客园所有文章

最近学习了下webmagic,学webmagic是因为想折腾下爬虫,但是自己学java的,又不想太费功夫,所以webmagic是比较好的选择了. 写了几个demo,源码流程大致看了一遍.想着把博客园的文章列表爬下来吧. 首页显示的就是第一页文章的列表, 但是翻页按钮不是链接,而是动态的地址: 实际请求的地址及参数: 针对这个动态页面的情况,有两种解决方案: 1. webmagic模拟post请求,获取返回页面. 1 public class CnblogsSpider implements Pa

Scrapy爬取博客园精华区内容

程序爬取目标 获取博客园精华区文章的标题.标题链接.作者.作者博客主页链接.摘要.发布时间.评论数.阅读数和推荐数,并存储到MongoDB中. 程序环境 已安装scrapy 已安装MongoDB 创建工程 scrapy startproject cnblogs 在命令提示符中执行上述命令后,会建立一个名为cnblogs的文件夹. 创建爬虫文件 cd cnblogs scrapy genspider cn cnblogs.com 执行上述命令后,会在cnblogs\spiders\下新建一个名为c