爬取的是三联生活周刊的这篇文章:
英国"脱欧":蝴蝶的翅膀动了(url:点击打开链接)
一、环境准备:
系统:Ubuntu
IDE:wingide
安装以及破解wingide可参考这篇文章:点击打开链接,需要注意的是,经过验证,这个破解的py脚本对最新的wingide 5.1破解失败,在官网下载wingide的时候,点击older version,安装5.0.X的版本,我安装的是5.0.1版本。
安装Phantom可以直接在这里下载,利用 tar 命令解压,之后将可执行文件放入系统路径,使用命令(参考这里):
sudo ln -s ~/bin/phantomjs/bin/phantomjs /usr/local/bin/phantomjs
安装selenium更简单:pip install selenium
二、流程
先查看页面源代码,可以发现文字段落都是由<p></p>包围起来的,所以正则表达式也不难写
通过使用phantomjs
爬取网页之后要删除一些不需要的元素,只留下文本,故定义一个工具类 class tool,用于删除不要的元素
三、代码:
#coding:utf-8
from selenium import webdriver
import urllib
import urllib2
import re
import time
class Art():
def __init__(self,url):
self.url = url
self.tool = tool()
#新建一个txt文件,保存获取文章
self.file = open("articale.txt","w")
#获取页面的html
def get_page(self):
driver = webdriver.PhantomJS()#Phantomjs()也可改为Firefox(),注意大小写
driver.get(self.url)
time.sleep(7)
#print driver.page_source#这个函数获取页面的html
response = driver.page_source.encode('utf-8')
#print response
print "Success To Create the screenshot & gather html"
driver.close()
return response
#获取文章标题
def get_title(self,page):
title_pattern = re.compile('<h1>(.*?)</h1>', re.S)
title = re.findall(title_pattern,page)
return title
#获取文章摘要
def get_abstrat(self,page):
abtract_pattern = re.compile('</div class="desc">(.*?)</div>',re.S)
abtract = re.findall(abtract_pattern,page)
return abtract
#获取正文内容
def get_content(self,page):
contents = []
content_pattern = re.compile('<article>.*?<p>(.*?)<div',re.S)
items = re.findall(content_pattern, page)
for item in items:
content = self.tool.replace(item)
contents.append(content)
return contents
#标题写入txt
def write_title(self,title):
for t in title:
self.file.write(str(t))
self.file.write("\n")
#摘要写入txt
def write_abstract(self,abstract):
for a in abstract:
self.file.write(str(a))
self.file.write("\n")
#正文写入txt
def write_content(self,content):
for item in content:
self.file.write(str(item))
self.file.write("\n")
#定义一个开始函数,爬虫从这里运行
def start(self):
page = self.get_page()
title = self.get_title(page)
self.write_title(title)
abstract = self.get_abstrat(page)
self.write_abstract(abstract)
content = self.get_content(page)
self.write_content(content)
class tool:
rmhref = re.compile('<p>|</p>|<p.*?</em>| ')
rspan = re.compile('<span.*?</span>')
def replace(self,x):
x = re.sub(self.rmhref, "",x)
x = re.sub(self.rspan,"",x)
return x.strip()
article=Art('http://www.lifeweek.com.cn/2016/0624/47804.shtml')
article.start()
四、运行结果