Python爬虫实践(十一):selenium+phantomjs+正则表达式爬取文章并保存

时间:2022-12-15 16:24:34

爬取的是三联生活周刊的这篇文章:

英国"脱欧":蝴蝶的翅膀动了(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>|&nbsp;')
    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()


四、运行结果

Python爬虫实践(十一):selenium+phantomjs+正则表达式爬取文章并保存

Python爬虫实践(十一):selenium+phantomjs+正则表达式爬取文章并保存