[Python爬虫] 之十三:Selenium +phantomjs抓取活动树会议活动数据
抓取活动树网站中会议活动数据(http://www.huodongshu.com/html/index.html)
具体的思路是[Python爬虫] 之十一中抓取活动行网站的类似,都是用多线程来抓取,但是由于活动树网站 ,每个关键字搜索页的ur是固定,比如搜索“数字”结果有470个结果,没页10条记录,第二页的url和第一页的 url是一样的。
因此针对每个关键字用一个线程进行搜索。


具体代码如下:
# coding=utf-8
import os
import re
from selenium import webdriver
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
import IniFile
from selenium.webdriver.common.keys import Keys
from threading import Thread
import thread
import LogFile
import urllib
import mongoDbBase
#抓取数据线程类
class ScrapyData_Thread(Thread):
#抓取数据线程类
def __init__(self,webSearchUrl,pageCountLable,htmlLable,originalUrlLabel,nextUrlLabel,keyword,db):
'''
构造函数
:param webSearchUrl: 搜索页url
:param pageCountLable: 搜索页数标签
:param htmlLable: 要搜索的标签
:param OriginalUrlLabel: 每个记录对应的url标签
:param nextUrlLabel: 下一页标签
:param keywords: 要搜索的关键字,多个关键字中间用分号(;)隔开
:param db: 保存数据库引擎
'''
Thread.__init__(self) self.webSearchUrl = webSearchUrl
self.pageCountLable = pageCountLable
self.htmlLable = htmlLable
self.originalUrlLabel = originalUrlLabel
self.nextUrlLabel = nextUrlLabel
self.keyword = keyword
self.db = db # IEDriverServer = self.cf.GetValue("section", "IEDriverServer")
# os.environ["webdriver.ie.driver"] = IEDriverServer
# self.urldriver = webdriver.Ie(IEDriverServer) 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 date_isValid(self, strDateText):
'''
判断日期时间字符串是否合法:如果给定时间大于当前时间是合法,或者说当前时间给定的范围内
:param strDateText: 三种格式 '017.04.27 ~ 04.28'; '2017.04.20 08:30 ~ 12:30' ; '2015.12.29 ~ 2016.01.03'
:return: True:合法;False:不合法
'''
datePattern = re.compile(r'\d{4}-\d{2}-\d{2}')
date = strDateText.replace('.', '-')
strDate = re.findall(datePattern, date)
currentDate = time.strftime('%Y-%m-%d') if len(strDate) == 2:
if self.compareDate(strDate[1], currentDate) > 0:
return True
elif len(strDate) == 1:
if self.compareDate(strDate[0], currentDate) >= 0:
return True
else:
datePattern = re.compile(r'\d{4}-\d{2}-\d{2}\s~\s\d{2}-\d{2}')
#2015-06-04 13:30 ~ 17:30
strDate = re.findall(datePattern, date)
if len(strDate) >0:
if self.compareDate(strDate[0][0:5] + strDate[0][13:], currentDate) >= 0:
return True
else:
return False
return False def run(self):
print ''
print '关键字:%s ' % self.keyword
self.driver.get(self.webSearchUrl)
time.sleep(5)
# 记录数
pageCount_elements = self.driver.find_elements_by_xpath(self.pageCountLable)
if len(pageCount_elements) > 0:
strCount = pageCount_elements[0].text.encode('utf8')
pageCount = int(strCount) / 10
if int(strCount) % 10 > 0:
pageCount = pageCount + 1 page_Count = pageCount
pageIndex = 0
kword = self.keyword
recordCount = 0
while pageCount > 0:
pageCount = pageCount - 1
if pageIndex > 0:
next_element = self.driver.find_elements_by_xpath(self.nextUrlLabel)
if len(next_element) > 0:
next_element[0].click()
time.sleep(3) 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')) index = 0
strMessage = ' '
strsplit = '\n------------------------------------------------------------------------------------\n'
index = 0
# 每页中有用记录
usefulCount = 0
meetingList = []
for element in Elements:
txt = element.text.encode('utf8') txts = txt.split('\n') # strDate = re.findall(self.datePattern, txt)
# 日期大于今天并且搜索的关键字在标题中才认为是复合要求的数据
if self.date_isValid(txts[1]) and txts[0].find(kword) > -1:
dictM = {'title': txts[0], 'date': txts[1],
'url': urlList[index], 'keyword': kword, 'info': txt}
meetingList.append(dictM) # 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
else:
self.db.SaveMeetings(meetingList) #保存数据库中 print "共浏览了: %d 页数据" % page_Count
print "共抓取了: %d 个符合条件的活动记录" % recordCount self.driver.close()
self.driver.quit() if __name__ == '__main__': configfile = os.path.join(os.getcwd(), 'activity.conf')
cf = IniFile.ConfigFile(configfile)
webSearchUrl = cf.GetValue("section", "webSearchUrl")
pageCountLable = cf.GetValue("section", "pageCountLable")
htmlLable = cf.GetValue("section", "htmlLable")
originalUrlLabel = cf.GetValue("section", "originalUrlLabel")
nextUrlLabel = cf.GetValue("section", "nextUrlLabel") keywords= cf.GetValue("section", "keywords")
keywordlist = keywords.split(';')
start = time.clock()
db = mongoDbBase.mongoDbBase()
for keyword in keywordlist:
if len(keyword) > 0:
url = webSearchUrl + urllib.quote(keyword)
t = ScrapyData_Thread(url, pageCountLable, htmlLable,originalUrlLabel,nextUrlLabel,keyword,db)
t.setDaemon(True)
t.start()
t.join() end = time.clock()
print "整个过程用时间: %f 秒" % (end - start)
配置文件内容:
[section]
#IE驱动的路径
iedriverserver = C:\Program Files\Internet Explorer\IEDriverServer.exe #要搜索的标签,如果有多个,中间用分号隔开
htmlLable = //div[@id ='eventList']/div[@class ='list'] #要获取爬虫也是的标签
pageCountLable = //span[@id='eventNumber'] #给定网址的搜索首页Url
webSearchUrl = http://www.huodongshu.com/html/find_search.html?search_keyword= #查找对应的原始url
originalUrlLabel = //div[@class='listR']/h2/a #下一页链接对应的标签
nextUrlLabel = //dt[@class='next']/a #文本输入框要搜索的关键字
keywords = 互联网电视;智能电视;数字;影音;家庭娱乐;节目;视听;版权;数据
[Python爬虫] 之十三:Selenium +phantomjs抓取活动树会议活动数据的更多相关文章
- [Python爬虫] 之八:Selenium +phantomjs抓取微博数据
基本思路:在登录状态下,打开首页,利用高级搜索框输入需要查询的条件,点击搜索链接进行搜索.如果数据有多页,每页数据是20条件,读取页数 然后循环页数,对每页数据进行抓取数据. 在实践过程中发现一个问题 ...
- [Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)
思路是这样的,给一系列关键字:互联网电视:智能电视:数字:影音:家庭娱乐:节目:视听:版权:数据等.在活动行网站搜索页(http://www.huodongxing.com/search?city=% ...
- C#使用Selenium+PhantomJS抓取数据
本文主要介绍了C#使用Selenium+PhantomJS抓取数据的方法步骤,具有很好的参考价值,下面跟着小编一起来看下吧 手头项目需要抓取一个用js渲染出来的网站中的数据.使用常用的httpclie ...
- python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)
python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...
- selenium+PhantomJS 抓取淘宝搜索商品
最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...
- python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...
- [Python爬虫] 之十一:Selenium +phantomjs抓取活动行中会议活动信息
一.介绍 本例子用Selenium +phantomjs爬取活动行(http://www.huodongxing.com/search?qs=数字&city=全国&pi=1)的资讯信息 ...
- [Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动
一.介绍 本例子用Selenium +phantomjs爬取活动树(http://www.huodongshu.com/html/find_search.html?search_keyword=数字) ...
- [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题
最近在抓取活动树网站 (http://www.huodongshu.com/html/find.html) 上数据时发现,在用搜索框输入中文后,点击搜索,phantomjs抓取数据怎么也抓取不到,但是 ...
随机推荐
- 是时候升级你的Js工具了-分页【基于JQ】
好久没有来逛园子,也好久没有更新博客,就像沉睡已久的人忽然被叫醒,忽然就被园友的回复惊醒了.园友提出了关于我之前一篇文章的疑问——可那已经是半年以前的博客了,加上我一直觉得分享给大家的应该是我最新的思 ...
- Vue组件之props,$emit与$on以及slot分发
组件实例之间的作用域是孤立存在,要让它们之间的信息互通,就必须采用组件的通信方式 props用于父组件向子组件传达信息 1.静态方式 eg: <body> <div id=&quo ...
- 转:Python安全 - 从SSRF到命令执行惨案
转:https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html Python安全 - 从SSRF到命令执行惨案 PH ...
- POJ 2253 Frogger【最短路变形/最小生成树的最大权/最小瓶颈树/A到B多条路径中的最小的最长边】
Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...
- SCU - 4439 Vertex Cover (图的最小点覆盖集)
Vertex Cover frog has a graph with \(n\) vertices \(v(1), v(2), \dots, v(n)\) and \(m\) edges \((v(a ...
- oracle substr
SUBSTR( string, start_position [, length ] ) Parameters or Arguments string The source string. start ...
- 【最小割】【Dinic】Gym - 101201G - Maximum Islands
题意:方格内有些位置是水域,有些位置是陆地,有些位置是被云彩遮挡住了:让你自己规定被云彩遮挡住的地方是陆地还是水域,使得陆地个数最多.(均为四连通块) 显然与陆地邻接的云彩填成水比较优.其他云彩格子填 ...
- 【预处理】【分类讨论】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains
分几种情况讨论: (1)仅用C或D买两个 ①买两个代价相同的(实际不同)(排个序) ②买两个代价不同的(因为买两个代价相同的情况已经考虑过了,所以此时对于同一个代价,只需要保存美丽度最高的喷泉即可)( ...
- bzoj 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜
3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜 Description 兽群中总是有一些麻烦制造者.约翰知道他的N(1≤N≤100)头奶牛中有一头总是说谎,其他的 ...
- 误改sudoers的访问权限后的修复
sudo: /etc/sudoers is mode 0777, should be 0440"问题的解决方法 ubuntu进入单用户模式,修改sudoers权限,修改root密码 1.重 ...