[Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动(多线程抓取)

  延续上个抓取活动行中会议活动的问题,上次使用是单线程的抓取,效率较低,现在使用多线程的抓取。

  数据的抓取分为两个过程:首先获取每个关键字搜索结果对应的url和页数,保存在列表里面,这个过程用一个线程来实现(类似生产者),同时根据获取的关键字的url和页数,抓取对应的数据,这个过程用多线程来抓取(类似消费者)

  这样整个抓取过程共用了144.366188 秒,采用单线程来进行抓取要用大概184秒,这样大概节省了40秒

  具体代码如下:

  

# coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.support.ui as uifrom selenium.webdriver.common.keys import Keysimport timefrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support.select import Selectimport IniFilefrom selenium.webdriver.common.keys import Keysimport LogFilefrom threading import Threadfrom Queue import Queue

global url_pageCount_keyword_listurl_pageCount_keyword_list = []# url_pageCount_keyword_queue = Queue()

#获取url线程类class GetUrl_Thread(Thread):    def __init__(self, IEDriverServer,keywordList,webSearchUrl,pageCountLable):        ‘‘‘        构造函数        :param IEDriverServer: IE驱动的路径路径,比如:C:\Program Files\Internet Explorer\IEDriverServer.exe        :param keywordList: 关键字列表        :param webSearchUrl: 网站搜索页url        :param pageCountLable: 页数标签        ‘‘‘        Thread.__init__(self)

        #关键字列表        self.keywordList = keywordList        self.pageCountLable = pageCountLable

        self.urldriver = webdriver.Ie(IEDriverServer)        self.wait = ui.WebDriverWait(self.urldriver, 20)        self.urldriver.maximize_window()        self.urldriver.get(webSearchUrl)

    def run(self):        # global url_pageCount_keyword_list        # self.urldriver.implicitly_wait(3)        time.sleep(3)        for keyword in self.keywordList:            if len(keyword) > 0:                js = "var obj = document.getElementById(‘mainSearchTextbox‘);obj.value=‘" + keyword + "‘;"                self.urldriver.execute_script(js)                # 点击搜索链接                ss_elements = self.urldriver.find_element_by_id("mainSearchTextbox")                ss_elements.send_keys(Keys.RETURN)                time.sleep(5)                current_url = self.urldriver.current_url.replace(‘pi=1‘, ‘pi=‘)                try:                    elements = self.urldriver.find_elements_by_xpath(self.pageCountLable)                    # 要爬虫的页数                    strCount = elements[0].text.encode(‘utf8‘)                    pageCount = int(strCount) / 10                    if int(strCount) % 10 > 0:                        pageCount = pageCount + 1                    # my_queue.put(current_url + ‘_‘ + str(pageCount))                    url_pageCount_keyword_list.append(current_url.encode(‘utf8‘) + ‘_‘ + str(pageCount) + ‘_‘ + keyword)                except Exception, e:                    print e.message

        self.urldriver.close()        self.urldriver.quit()

#抓取数据线程类class ScrapyData_Thread(Thread):    def __init__(self, url_pageCount_keyword,htmlLable,OriginalUrlLabel):        ‘‘‘        构造函数        :param url_pageCount_keyword: 关键字搜索结果url+页数+关键字        :param htmlLable: 要搜索的标签        :param OriginalUrlLabel: 每个记录对应的url标签        ‘‘‘        Thread.__init__(self)        #对应关键字搜索结果的url        self.current_url = url_pageCount_keyword.split(‘_‘)[0]        #搜索结果的页数        self.pageCount = int(url_pageCount_keyword.split(‘_‘)[1])        #关键字        self.keyword = url_pageCount_keyword.split(‘_‘)[2]

        self.htmlLable = htmlLable        self.OriginalUrlLabel = OriginalUrlLabel        self.currentDate = time.strftime(‘%Y-%m-%d‘)        self.datePattern = re.compile(r‘\d{4}-\d{2}-\d{2}‘)

        self.driver = webdriver.PhantomJS()        self.wait = ui.WebDriverWait(self.driver, 20)        self.driver.maximize_window()

    def compareDate(self, dateLeft, dateRight):        ‘‘‘        比较俩个日期的大小        :param dateLeft: 日期 格式2017-03-04        :param dateRight:日期 格式2017-03-04        :return: 1:左大于右,0:相等,-1:左小于右        ‘‘‘        dls = dateLeft.split(‘-‘)        drs = dateRight.split(‘-‘)        if len(dls) > len(drs):            return 1        if int(dls[0]) == int(drs[0]) and int(dls[1]) == int(drs[1]) and int(dls[2]) == int(drs[2]):            return 0

        if int(dls[0]) > int(drs[0]):            return 1        elif int(dls[0]) == int(drs[0]) and int(dls[1]) > int(drs[1]):            return 1        elif int(dls[0]) == int(drs[0]) and int(dls[1]) == int(drs[1]) and int(dls[2]) > int(drs[2]):            return 1        return -1    def run(self):        try:            print ‘‘            print ‘关键字:%s ‘ % self.keyword

            pageCount = self.pageCount            recordCount = 0            if pageCount > 0:                pageIndex = 0                while pageCount > 0:                    url = self.current_url + str(pageIndex)                    self.driver.get(url)

                    # 延迟3秒                    time.sleep(3)                    # self.driver.implicitly_wait(3)                    pageCount = pageCount - 1                    self.wait.until(lambda driver: self.driver.find_elements_by_xpath(self.htmlLable))                    Elements = self.driver.find_elements_by_xpath(self.htmlLable)

                    # 查找微博对应的原始url                    urlList = []                    self.wait.until(lambda driver: self.driver.find_elements_by_xpath(self.OriginalUrlLabel))                    hrefElements = self.driver.find_elements_by_xpath(self.OriginalUrlLabel)                    for hrefe in hrefElements:                        urlList.append(hrefe.get_attribute(‘href‘).encode(‘utf8‘))

                    # self.driver.implicitly_wait(2)                    index = 0                    strMessage = ‘ ‘                    strsplit = ‘\n------------------------------------------------------------------------------------\n‘                    index = 0                    # 每页中有用记录                    usefulCount = 0                    for element in Elements:                        txt = element.text.encode(‘utf8‘)                        txts = txt.split(‘\n‘)                        strDate = re.findall(self.datePattern, txt)                        # 日期大于今天并且搜索的关键字在标题中才认为是复合要求的数据                        if len(strDate) > 0 and self.compareDate(strDate[0], self.currentDate) == 1 and \                                        txts[0].find(self.keyword) > -1:                            print ‘ ‘                            print txt                            print ‘活动链接:‘ + urlList[index]                            print strsplit

                            strMessage = txt + "\n"                            strMessage += ‘活动链接:‘ + urlList[index] + "\n"                            strMessage += strsplit                            strMessage = unicode(strMessage, ‘utf8‘)                            # log.WriteLog(strMessage)                            usefulCount = usefulCount + 1                            recordCount = recordCount + 1                        index = index + 1

                    pageIndex = pageIndex + 1                    if usefulCount == 0:                        break

            print "共浏览了: %d 页数据" % self.pageCount            print "共抓取了: %d 个符合条件的活动记录" % recordCount        except Exception, e:            print e.message

        self.driver.close()        self.driver.quit()

if __name__ == ‘__main__‘:    configfile = os.path.join(os.getcwd(), ‘MeetingConfig.conf‘)    cf = IniFile.ConfigFile(configfile)    IEDriverServer = cf.GetValue("section", "IEDriverServer")    os.environ["webdriver.ie.driver"] = IEDriverServer

    keyword = cf.GetValue("section", "keywords")    keywordList = keyword.split(‘;‘)

    webSearchUrl = cf.GetValue("section", "webSearchUrl")    pageCountLable = cf.GetValue("section", "pageCountLable")    htmlLable = cf.GetValue("section", "htmlLable")    OriginalUrlLabel = cf.GetValue("section", "OriginalUrlLabel")

    start = time.clock()    turl = GetUrl_Thread(IEDriverServer,keywordList,webSearchUrl,pageCountLable)    turl.start()

    while True:        if len(url_pageCount_keyword_list) >0:            url_pageCount_keyword = url_pageCount_keyword_list[0]            url_pageCount_keyword_list.remove(url_pageCount_keyword)            t = ScrapyData_Thread(url_pageCount_keyword, htmlLable, OriginalUrlLabel)            t.setDaemon(True)            t.start()            t.join()        else:            if turl.isAlive():                time.sleep(1)            else:                break

    end = time.clock()    print "整个过程用时间: %f 秒" % (end - start)

  

				
时间: 2024-08-14 23:17:11

[Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动(多线程抓取)的相关文章

[Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)

思路是这样的,给一系列关键字:互联网电视:智能电视:数字:影音:家庭娱乐:节目:视听:版权:数据等.在活动行网站搜索页(http://www.huodongxing.com/search?city=%E5%85%A8%E5%9B%BD&pi=1)的文本输入框中分别输入每个关键字,在搜索结果中抓取需要的数据. 首先通过Selenium+IE驱动得到每个关键字搜索结果的url(首页,因为以后各个页的url就是索引不一样)和总页数,保存的列表里面.然后再循环列表,用Selenium +phantomj

[Python爬虫] 之三:Selenium 调用IEDriverServer 抓取数据

接着上一遍,在用Selenium+phantomjs 抓取数据过程中发现,有时候抓取不到,所以又测试了用Selenium+浏览器驱动的方式:具体代码如下: #coding=utf-8import osimport refrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timefrom selenium.webdriver.common.action_chains import A

Python爬虫利器四之PhantomJS的用法

前言 大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的html代码,如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS渲染的到的一些结果,那简直没天理了.所以,我们需要有一些好用的工具来帮助我们像浏览器一样渲染JS处理的页面. 其中有一个比较常用的工具,那就是 PhantomJS Full web stack No browser required PhantomJS is a headless WebKit scriptable with a Ja

[Python爬虫] 之十五:Selenium +phantomjs根据微信公众号抓取微信文章

借助搜索微信搜索引擎进行抓取 抓取过程 1.首先在搜狗的微信搜索页面测试一下,这样能够让我们的思路更加清晰 在搜索引擎上使用微信公众号英文名进行“搜公众号”操作(因为公众号英文名是公众号唯一的,而中文名可能会有重复,同时公众号名字一定要完全正确,不然可能搜到很多东西,这样我们可以减少数据的筛选工作, 只要找到这个唯一英文名对应的那条数据即可),即发送请求到'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&_sug_=n&

[Python爬虫] 之十九:Selenium +phantomjs 利用 pyquery抓取超级TV网数据

一.介绍 本例子用Selenium +phantomjs爬取超级TV(http://www.chaojitv.com/news/index.html)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信息 三.数据抓取 针对上面的网站信息,来进行抓取 1.首先抓取信息列表 抓取代码:Elements = doc('ul[class="la_list"]').find('li') 2.

[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对比,你可以进一步加深Python爬虫的印象.同时,文章给出了我以前关于爬虫的基础知识介绍,方便新手进行学习.        总之,希望文章对你有所帮助,如果存在不错或者错误的地方,还请海涵~ 一. DOM树结构分析 豆瓣Top250电影网址:https://movie.douban.com/top2

Python爬虫利器:Selenium的用法

本文和大家分享的主要是python 爬虫 利器Selenium的相关内容,一起来看看吧,希望对大家 学习python爬虫有所帮助. Selenium  是什么?一句话,自动化测试工具.它支持各种浏览器,包括  Chrome , Safari , Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个  Selenium  的插件,那么便可以方便地实现 Web界面的测试.换句话说叫  Selenium  支持这些浏览器驱动.话说回来, PhantomJS 不也是一个浏览器吗,那么  S

python爬虫之初始Selenium

1.初始 Selenium[1]  是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上.测试系统功能--创建回归测试检验软件功能和用户需求.支持自动录制动作和自动生成 .Net.Java.Per

[Python爬虫] Windows下Selenium自动访问Firefox和Chrome并实现搜索截图

前两篇文章介绍了安装,此篇文章算是一个简单的进阶应用吧!它是在Windows下通过Selenium+Python实现自动访问Firefox和Chrome并实现搜索截图的功能. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上) [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium 自动访问Firefox 可以参照前文安装Selenium环境,目前Selenium这个用于Web应用程序测试的工具支持的浏览器包括IE.