Python爬虫抓取csdn博客
昨天晚上为了下载保存某位csdn大牛的所有博文,写了一个爬虫来自己主动抓取文章并保存到txt文本,当然也能够 保存到html网页中。
这样就能够不用Ctrl+C 和Ctrl+V了,很方便。抓取别的站点也是大同小异。
为了解析抓取的网页。用到了第三方模块,BeautifulSoup,这个模块对于解析html文件很实用,当然也能够自己使用正則表達式去解析,可是比較麻烦。
因为csdn站点的robots.txt文件里显示禁止不论什么爬虫,所以必须把爬虫伪装成浏览器。并且不能频繁抓取。得sleep一会再抓。使用频繁会被封ip的,但能够使用代理ip。
#-*- encoding: utf-8 -*-
'''
Created on 2014-09-18 21:10:39 @author: Mangoer
@email: 2395528746@qq.com
''' import urllib2
import re
from bs4 import BeautifulSoup
import random
import time class CSDN_Blog_Spider:
def __init__(self,url): print '\n'
print('已启动网络爬虫。。 。')
print '网页地址: ' + url user_agents = [
'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
'Opera/9.25 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 ",
]
# use proxy ip
# ips_list = ['60.220.204.2:63000','123.150.92.91:80','121.248.150.107:8080','61.185.21.175:8080','222.216.109.114:3128','118.144.54.190:8118',
# '1.50.235.82:80','203.80.144.4:80'] # ip = random.choice(ips_list)
# print '使用的代理ip地址: ' + ip # proxy_support = urllib2.ProxyHandler({'http':'http://'+ip})
# opener = urllib2.build_opener(proxy_support)
# urllib2.install_opener(opener) agent = random.choice(user_agents) req = urllib2.Request(url)
req.add_header('User-Agent',agent)
req.add_header('Host','blog.csdn.net')
req.add_header('Accept','*/*')
req.add_header('Referer','http://blog.csdn.net/mangoer_ys? viewmode=list')
req.add_header('GET',url)
html = urllib2.urlopen(req)
page = html.read().decode('gbk','ignore').encode('utf-8') self.page = page
self.title = self.getTitle()
self.content = self.getContent()
self.saveFile() def printInfo(self):
print('文章标题是: '+self.title + '\n')
print('内容已经存储到out.txt文件里!') def getTitle(self):
rex = re.compile('<title>(.*?)</title>',re.DOTALL)
match = rex.search(self.page)
if match:
return match.group(1) return 'NO TITLE' def getContent(self):
bs = BeautifulSoup(self.page)
html_content_list = bs.findAll('div',{'id':'article_content','class':'article_content'})
html_content = str(html_content_list[0]) rex_p = re.compile(r'(?:.*?)>(.*?)<(? :.*?)',re.DOTALL)
p_list = rex_p.findall(html_content) content = ''
for p in p_list:
if p.isspace() or p == '':
continue
content = content + p
return content def saveFile(self): outfile = open('out.txt','a')
outfile.write(self.content) def getNextArticle(self):
bs2 = BeautifulSoup(self.page)
html_nextArticle_list = bs2.findAll('li',{'class':'prev_article'})
# print str(html_nextArticle_list[0])
html_nextArticle = str(html_nextArticle_list[0])
# print html_nextArticle rex_link = re.compile(r'<a href=\"(.*?)\"',re.DOTALL)
link = rex_link.search(html_nextArticle)
# print link.group(1) if link:
next_url = 'http://blog.csdn.net' + link.group(1)
return next_url return None class Scheduler:
def __init__(self,url):
self.start_url = url def start(self):
spider = CSDN_Blog_Spider(self.start_url)
spider.printInfo() while True:
if spider.getNextArticle():
spider = CSDN_Blog_Spider(spider.getNextArticle())
spider.printInfo()
elif spider.getNextArticle() == None:
print 'All article haved been downloaded!'
break time.sleep(10) #url = input('请输入CSDN博文地址:')
url = "http://blog.csdn.net/mangoer_ys/article/details/38427979" Scheduler(url).start()
程序中有个问题一直不能解决:不能使用标题去命名文件,所以所有的文章所有放在一个out.txt中,说的编码的问题。希望大神能够解决问题。
Python爬虫抓取csdn博客的更多相关文章
- Python实现抓取CSDN博客首页文章列表
1.使用工具: Python3.5 BeautifulSoup 2.抓取网站: csdn首页文章列表 http://blog.csdn.net/ 3.分析网站文章列表代码: 4.实现抓取代码: __a ...
- Python爬虫简单实现CSDN博客文章标题列表
Python爬虫简单实现CSDN博客文章标题列表 操作步骤: 分析接口,怎么获取数据? 模拟接口,尝试提取数据 封装接口函数,实现函数调用. 1.分析接口 打开Chrome浏览器,开启开发者工具(F1 ...
- JAVA爬虫挖取CSDN博客文章
开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...
- Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫
网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...
- Python爬虫:爬取自己博客的主页的标题,链接,和发布时间
代码 # -*- coding: utf-8 -*- """ ------------------------------------------------- File ...
- 利用Python抓取CSDN博客
这两天发现了一篇好文章,陈皓写的makefile的教程,具体地址在这里<跟我一起写makefile> 这篇文章一共分成了14个部分,我看东西又习惯在kindle上面看,感觉一篇一篇地复制成 ...
- python 爬虫 爬取序列博客文章列表
python中写个爬虫真是太简单了 import urllib.request from pyquery import PyQuery as PQ # 根据URL获取内容并解码为UTF-8 def g ...
- python抓取51CTO博客的推荐博客的全部博文,对标题分词存入mongodb中
原文地址: python抓取51CTO博客的推荐博客的全部博文,对标题分词存入mongodb中
- python 爬虫抓取心得
quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quo ...
随机推荐
- JavaScript--确认(confirm 消息对话框)
confirm 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confirm(str); 参数说明: str:在消息对话框中要显示 ...
- 关于处理移动端Vue单页面及其内嵌兼容问题
关于处理移动端Vue单页面及其内嵌兼容问题 question:由于最近转移了以前的H5项目,重构使用Vue单页面,导致部分手机内嵌或在微信浏览器中无法浏览,或者无法使用ajax请求:手机机型千变万化, ...
- favourite和favorite的区别
同一个词,英式和美式的拼写法而已.通常英式英语里的-our-字母组合,到了美式英语里面都成了-or-字母组合,最常见的有英式的 colour,到美式英语成了 color.
- 程序员的幽默-献给所有Java程序员
1. 一程序员去面试,面试官问:“你毕业才两年,这三年工作经验是怎么来的?!”程序员答:“加班.” 2. 某程序员对书法十分感兴趣,退休后决定在这方面有所建树.于是花重金购买了上等的文房四宝.一日,饭 ...
- Gradle的属性Property设置与调用
Gradle在默认情况下已经为Project定义了很多Property: project:Project本身 name:Project的名字 path:Project的绝对路径 description ...
- [Windows Server 2008] SQL Server 2008 数据库还原方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:还原SQL S ...
- js 性能调试
今天有幸偶遇我早就神往已久的性能调试问题. 原来js调试工具里面有可以记录每个方法的执行时间的功能,站在此功能的肩膀上就可以对自己的程序性能.瓶颈了如指掌,就可以针对性的,瞄准目标,斩草除根,以绝后患 ...
- Effective Java中文版
译者序 序 前言 第一章 引言 第二章 创建和销毁对象 第1条:考虑用静态工厂方法代替构造函数 第2条:使用私有构造函数强化singleton属性 第3条:通过私有构造函数强化不可实例化属性 第4条: ...
- PHP 之二位数组根据某个字段排序封装
/** * @param $array * @param $keys * @param string $sort * @return array */ function arraySort($arra ...
- PAT_A1003#Emergency
Source: PAT A1003 Emergency (25 分) Description: As an emergency rescue team leader of a city, you ar ...