1.简介
python爬虫是python应用的一个重要方便,最近用高Python2.7.8(只所以没有选最新的3.4,是因为有些模块还没有移植到最新python版本)写了一个小例子,在调试过程中碰到的最头疼的问题是中文乱码和正则表达式,要解决这两个问题,办法有,python源文件一定要用utf-8编码格式保存,每个python文件开头这样写,
import sys;
reload(sys);
sys.setdefaultencoding('utf-8');
告诉python解释器,字符串是utf-8格式,或者字符串这样写u'python utf-8 字符串',还有就是正则表达式也要用u''这种格式,总是尽一切可能保证你用的每个字符串都是用utf-8就能很好的避免乱码的问题,
用的开发环境是python2.7.8 和 vs2010 + ptvs插件
2.源码
python爬虫是python应用的一个重要方便,最近用高Python2.7.8(只所以没有选最新的3.4,是因为有些模块还没有移植到最新python版本)写了一个小例子,在调试过程中碰到的最头疼的问题是中文乱码和正则表达式,要解决这两个问题,办法有,python源文件一定要用utf-8编码格式保存,每个python文件开头这样写,
import sys;
reload(sys);
sys.setdefaultencoding('utf-8');
告诉python解释器,字符串是utf-8格式,或者字符串这样写u'python utf-8 字符串',还有就是正则表达式也要用u''这种格式,总是尽一切可能保证你用的每个字符串都是用utf-8就能很好的避免乱码的问题,
用的开发环境是python2.7.8 和 vs2010 + ptvs插件
2.源码
import urllib;
import urllib2;
import time;
import thread;
import threading;
import re;
import os;
import types;
import codecs;
import sys;
#判断一个字符串是不是int类型
def IsInt(intStr):
try:
int(intStr);
return True;
except:
return False;
class XuwBot:
def __init__(self):
self.userCode = 'XuWei_XuWei'; #默认抓取当前用户的文章
self.articleType = '-1';#要抓取的文章类别
self.startPageNum = 1;#抓取的起始页
self.endPageNum = -1;#抓取的结束页
self.currentPageNum = 1;#当前正在抓取的页
self.downloadContainer = [];#存放要下载的文章的地址,下载线程从此容器获取地址,下载保存文章,
self.threadLock = threading.Lock();#线程锁
self.exitFlag = False;
#爬取文章列表
def GetArticleList(self):
reqUrl = 'http://blog.csdn.net/' + str(self.userCode) + '/article/list/' + str(self.currentPageNum);#请求地址
headersData = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0'};#请求头,伪装成ff浏览器,用的是我本机ff的请求头
req = urllib2.Request(reqUrl,headers = headersData);
timeout = 20;#请求超时时间
req.timeout = timeout;
print(u'开始请求第'+ str(self.currentPageNum) + u'页文章列表');
try :
opener = urllib2.urlopen(req);#获取opener
articlePageSource = opener.read().decode('utf-8');#csdn本身页面也是用utf-8编码的
except:
print(u'请求第' + str(self.currentPageNum) + u'页文章列表出错,将跳过爬取本页列表');
articlePageSource = '';
pass;
#通过正则表达式查找文章和尾页数
if (self.endPageNum == -1):
pageListText = re.findall(u'<div.*?id="papelist".*?class="pagelist">(.*?)</div>',articlePageSource,re.S);
pageNumText = re.findall(u'共[0-9]{1,}页',pageListText[0],re.S);
articleNumText = re.findall(u'[0-9]{1,}条数据',pageListText[0],re.S);
pageNum = i