最近在学习python的爬虫,参照了http://cuiqingcai.com/990.html的内容,写了一个爬虫,抓取流程:传入参数起始url和输出文件名称,使用urllib2对页面进行抓取,每次抓取一个页面,循环抓取,直到最后一页。使用正则表达式对抓取到的页面内容进行提取,并保存到文件中。程序如下:
# -*- coding: utf-8
import urllib2
import urllib
import re,os
import time
class Joke:
#初始化数据
def __init__(self,start_url,out_put_file):
self.start_url = start_url
self.out_put_file = out_put_file
self.page = 2
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
self.headers = { 'User-Agent' : self.user_agent }
#获取页面内容的方法
def get_cotent(self,page):
try:
url = self.start_url + str(page) + '/?s=4955352'
request = urllib2.Request(url,headers=self.headers)
response = urllib2.urlopen(request)
act_url = response.geturl()
print 'init url=',url,'act url=',act_url
if url == act_url:
content = response.read()
return content
else:
return None
except urllib2.URLError, e:
if hasattr(e,"reason"):
print u"连接糗事百科失败,错误原因",e.reason
return None
#传入页面代码,返回笑话内容
def get_joke(self,page):
joke_content = self.get_cotent(page)
str = ''
if not joke_content:
print "抓取完毕"
return None
pattern = re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?'
+'<div class="content">.*?<span>(.*?)',re.S)
items = re.findall(pattern,joke_content)
for item in items:
str = str + '发布人:' + item[0] + '\n' + '发布内容:' + '\n' + item[1] + '\n'+ '\n'
return str
#讲抓取到的笑话保存到文件的方法
def writeStr2File(self,out_put_file,str1,append = 'a'):
# 去掉文件,保留路径。比如 'a/b/c/d.txt' 经过下面代码会变成 'a/b/c'
subPath = out_put_file[:out_put_file.rfind('/')]
# 如果给定的路径中,文件夹不存在,则创建
if not os.path.exists(subPath):
os.makedirs(subPath)
# 打开文件并将 str 内容写入给定的文件
with open(out_put_file, append) as f:
f.write(str1.strip()+'\n')
#开始抓取页面内容,每次抓取一个页面,直到抓取完毕所有页面
def start_crawl(self):
while True:
joke_str = self.get_joke(self.page)
if not joke_str:
break
time.sleep(1)
#print(joke_str)
self.writeStr2File(self.out_put_file,joke_str)
self.page+=1
spider = Joke('http://www.qiushibaike.com/hot/page/','d:/python/test/out.txt')
spider.start_crawl()
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-2133368/
,如需转载,请注明出处,否则将追究法律责任。