一、介绍

    本例子用Selenium +phantomjs爬取活动树(http://www.huodongshu.com/html/find_search.html?search_keyword=数字)的资讯信息,输入给定关键字抓取资讯信息。

    给定关键字:数字;融合;电视

    抓取信息内如下:

      1、资讯标题

      2、资讯链接

      3、资讯时间

      4、资讯来源

 

  二、网站信息

    

    

  

  三、数据抓取

    针对上面的网站信息,来进行抓取

    1、首先抓取信息列表

      抓取代码:Elements = doc('div[id="eventList"]').find('div[class="list"]')

    2、抓取标题

      抓取代码:title = element('h3').find('a').text().encode('utf8').strip()

    3、抓取链接

      抓取代码:url = 'http://www.huodongshu.com' + element('h2').find('a').attr('href')

    4、抓取日期

      抓取代码:element('div[class="info time"]').text().encode('utf8').strip()

    5、抓取主办方

      抓取代码:orgnizer = element('div[class="info title"]').find('a').text().encode('utf8').strip()

    6、抓取地点

      抓取代码:area = element('div[class="info site"]').text().encode('utf8').strip()

  

  四、完整代码

  1. # coding=utf-8
  2. import os
  3. import re
  4. from selenium import webdriver
  5. import selenium.webdriver.support.ui as ui
  6. import time
  7. from datetime import datetime
  8. from selenium.webdriver.common.action_chains import ActionChains
  9. import IniFile
  10. # from threading import Thread
  11. from pyquery import PyQuery as pq
  12. import LogFile
  13. import mongoDB
  14. import urllib
  15. class huodongshuSpider(object):
  16. def __init__(self):
  17.  
  18. logfile = os.path.join(os.path.dirname(os.getcwd()), time.strftime('%Y-%m-%d') + '.txt')
  19. self.log = LogFile.LogFile(logfile)
  20. configfile = os.path.join(os.path.dirname(os.getcwd()), 'setting.conf')
  21. cf = IniFile.ConfigFile(configfile)
  22. self.keyword_list = cf.GetValue("section", "meeting_keywords").split(';')
  23. websearch_url = cf.GetValue("huodongshu", "websearchurl")
  24. self.db = mongoDB.mongoDbBase()
  25. self.start_urls = []
  26.  
  27. for keyword in self.keyword_list:
  28. url = websearch_url + urllib.quote(keyword)
  29. self.start_urls.append(url)
  30.  
  31. self.driver = webdriver.PhantomJS()
  32. self.wait = ui.WebDriverWait(self.driver, 2)
  33. self.driver.maximize_window()
  34.  
  35. def scroll_foot(self):
  36. '''
  37. 滚动条拉到底部
  38. :return:
  39. '''
  40. js = ""
  41. # 如何利用chrome驱动或phantomjs抓取
  42. if self.driver.name == "chrome" or self.driver.name == 'phantomjs':
  43. js = "var q=document.body.scrollTop=10000"
  44. # 如何利用IE驱动抓取
  45. elif self.driver.name == 'internet explorer':
  46. js = "var q=document.documentElement.scrollTop=10000"
  47. return self.driver.execute_script(js)
  48.  
  49. def compareDate(self, dateLeft, dateRight):
  50. '''
  51. 比较俩个日期的大小
  52. :param dateLeft: 日期 格式2017-03-04
  53. :param dateRight:日期 格式2017-03-04
  54. :return: 1:左大于右,0:相等,-1:左小于右
  55. '''
  56. dls = dateLeft.split('-')
  57. drs = dateRight.split('-')
  58. if len(dls) > len(drs):
  59. return 1
  60. if int(dls[0]) == int(drs[0]) and int(dls[1]) == int(drs[1]) and int(dls[2]) == int(drs[2]):
  61. return 0
  62.  
  63. if int(dls[0]) > int(drs[0]):
  64. return 1
  65. elif int(dls[0]) == int(drs[0]) and int(dls[1]) > int(drs[1]):
  66. return 1
  67. elif int(dls[0]) == int(drs[0]) and int(dls[1]) == int(drs[1]) and int(dls[2]) > int(drs[2]):
  68. return 1
  69. return -1
  70.  
  71. def date_isValid(self, strDateText):
  72. '''
  73. 判断日期时间字符串是否合法:如果给定时间大于当前时间是合法,或者说当前时间给定的范围内
  74. :param strDateText: 三种格式 '2017.04.27 ~ 04.28'; '2017.04.20 08:30 ~ 12:30' ; '2015.12.29 ~ 2016.01.03'
  75. :return: True:合法;False:不合法
  76. '''
  77. datePattern = re.compile(r'\d{4}-\d{2}-\d{2}')
  78. date = strDateText.replace('.', '-')
  79. strDate = re.findall(datePattern, date)
  80. currentDate = time.strftime('%Y-%m-%d')
  81. flag = False
  82. startdate = ''
  83. enddate = ''
  84. if len(strDate) == 2:
  85. # '2015.12.29 ~ 2016.01.03'
  86. if self.compareDate(strDate[1], currentDate) > 0:
  87. flag = True
  88. startdate = strDate[0]
  89. enddate = strDate[1]
  90. elif len(strDate) == 1:
  91.  
  92. if date.find(':') > 0:
  93. # 2017.04.20 08:30 ~ 12:30
  94. if self.compareDate(strDate[0], currentDate) >= 0:
  95. flag = True
  96. startdate = strDate[0]
  97. enddate = strDate[0]
  98. else:
  99. # 2017.07.13 ~ 07.15
  100. startdate = strDate[0]
  101. enddate = date[0:5] + date[len(date) - 5:]
  102. if self.compareDate(enddate, currentDate) >= 0:
  103. flag = True
  104. return flag, startdate, enddate
  105.  
  106. def log_print(self, msg):
  107. '''
  108. # 日志函数
  109. # :param msg: 日志信息
  110. # :return:
  111. # '''
  112. print '%s: %s' % (time.strftime('%Y-%m-%d %H-%M-%S'), msg)
  113.  
  114. def scrapy_date(self):
  115. strsplit = '------------------------------------------------------------------------------------'
  116. for link in self.start_urls:
  117. # time.sleep(1)
  118. self.driver.get(link)
  119. selenium_html = self.driver.execute_script("return document.documentElement.outerHTML")
  120. doc = pq(selenium_html)
  121. infoList = []
  122.  
  123. self.log.WriteLog(strsplit)
  124. self.log_print(strsplit)
  125. Elements = doc('div[id="eventList"]').find('div[class="list"]')
  126.  
  127. for element in Elements.items():
  128. date = element('div[class="info time"]').text().encode('utf8').strip()
  129. flag, startdate, enddate = self.date_isValid(date)
  130. if flag:
  131. title = element('h2').find('a').text().encode('utf8').strip()
  132.  
  133. for keyword in self.keyword_list:
  134. if title.find(keyword) > -1:
  135. url = 'http://www.huodongshu.com' + element('h2').find('a').attr('href')
  136. orgnizer = element('div[class="info title"]').find('a').text().encode('utf8').strip()
  137. area = element('div[class="info site"]').text().encode('utf8').strip()
  138. dictM = {'title': title, 'date': date,
  139. 'url': url, 'keyword': keyword,
  140. 'startdate': startdate, 'enddate': enddate,
  141. 'area': area, 'organizer': orgnizer}
  142. infoList.append(dictM)
  143. # self.log.WriteLog('title:%s'%title)
  144. # self.log.WriteLog('url:%s' % url)
  145. # self.log.WriteLog('orgnizer:%s' % orgnizer)
  146. # self.log.WriteLog('kword:%s' % keyword)
  147. # self.log.WriteLog('area:%s' % area)
  148. # self.log.WriteLog('-----------------------------------' )
  149.  
  150. self.log_print('title:%s' % title)
  151. self.log_print('url:%s' % url)
  152. self.log_print('date:%s' % date)
  153. self.log_print('orgnizer:%s' % orgnizer)
  154. self.log_print('kword:%s' % keyword)
  155. self.log_print('area:%s' % area)
  156. self.log_print('--------------------------' )
  157. break
  158. if len(infoList)>0:
  159. self.db.SaveMeetings(infoList)
  160. self.driver.close()
  161. self.driver.quit()
  162.  
  163. obj = huodongshuSpider()
  164. obj.scrapy_date()

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

  1. [Python爬虫] 之八:Selenium +phantomjs抓取微博数据

    基本思路:在登录状态下,打开首页,利用高级搜索框输入需要查询的条件,点击搜索链接进行搜索.如果数据有多页,每页数据是20条件,读取页数 然后循环页数,对每页数据进行抓取数据. 在实践过程中发现一个问题 ...

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

    思路是这样的,给一系列关键字:互联网电视:智能电视:数字:影音:家庭娱乐:节目:视听:版权:数据等.在活动行网站搜索页(http://www.huodongxing.com/search?city=% ...

  3. [Python爬虫] 之十一:Selenium +phantomjs抓取活动行中会议活动信息

    一.介绍 本例子用Selenium +phantomjs爬取活动行(http://www.huodongxing.com/search?qs=数字&city=全国&pi=1)的资讯信息 ...

  4. [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题

    最近在抓取活动树网站 (http://www.huodongshu.com/html/find.html) 上数据时发现,在用搜索框输入中文后,点击搜索,phantomjs抓取数据怎么也抓取不到,但是 ...

  5. C#使用Selenium+PhantomJS抓取数据

    本文主要介绍了C#使用Selenium+PhantomJS抓取数据的方法步骤,具有很好的参考价值,下面跟着小编一起来看下吧 手头项目需要抓取一个用js渲染出来的网站中的数据.使用常用的httpclie ...

  6. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  7. selenium+PhantomJS 抓取淘宝搜索商品

    最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...

  8. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  9. [Python爬虫] 之十三:Selenium +phantomjs抓取活动树会议活动数据

    抓取活动树网站中会议活动数据(http://www.huodongshu.com/html/index.html) 具体的思路是[Python爬虫] 之十一中抓取活动行网站的类似,都是用多线程来抓取, ...

随机推荐

  1. [你必须知道的.NET]第二十六回:认识元数据和IL(下)

    发布日期:2009.03.04 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 书接上回: 第二十四回:认识元数据和IL(上), ...

  2. 关于在C#对类的属性理解

    在类中都有一些成员.什么是类中的成员呢,我个人理解的是一个类中所应有的属性,方法,字段(因为目前才接触到类.所以类中一些其它应有的东西还不太熟悉),现在只探讨我列举的这几个在类中应有的东西.什么是属性 ...

  3. 360杀毒导致的 VS 报扩展错误,请查看 ActiveLog.xml

    360杀毒将 TypeScript的 tsserver.js 列为木马,结果导致VS2017启动时,总是报错,将其加为信任即可解决.

  4. 五十六 SMTP发送邮件

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...

  5. webstorm中.vue报错

    1.webstorm中es6语法报错,解决方法: 打开 Settings => Languages & Frameworks => Javascript把 Javascript L ...

  6. 洛谷——P1113 杂务

    P1113 杂务 题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务 ...

  7. 北邮校赛 H. Black-white Tree (猜的)

    H. Black-white Tree 2017- BUPT Collegiate Programming Contest - sync 时间限制 1000 ms 内存限制 65536 KB 题目描述 ...

  8. Linux命令之which

    which [选项] [命令] 将命令的完整路径写入标准输出.具体是在环境变量PATH设置的目录里查找符合条件的文件,而环境变量PATH中保存了查找命令时需要遍历的目录. (1).选项 -v,-V,- ...

  9. 查看所有shell类型

    [xf@xuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/no ...

  10. 解决CDH的web界面使用nginx代理一些静态文件无法加载

    vim /opt/cm-/share/cmf/webapp/WEB-INF/spring/mvc-config.xml .... 注释此行 <bean class="com.cloud ...