Python多进程方式抓取基金网站内容的方法分析


Posted in Python onJune 03, 2019

本文实例讲述了Python多进程方式抓取基金网站内容的方法。分享给大家供大家参考,具体如下:

在前面这篇//3water.com/article/162418.htm我们已经简单了解了”python的多进程”,现在我们需要把抓取基金网站(28页)内容写成多进程的方式。

因为进程也不是越多越好,我们计划分3个进程执行。意思就是 :把总共要抓取的28页分成三部分。

怎么分呢?

# 初始range
r = range(1,29)
# 步长
step = 10
myList = [r[x:x+step] for x in range(0,len(r),step)]
print(myList) # [range(1, 11), range(11, 21), range(21, 29)]

看上面代码,我们就把1~29分成了三部分,list里三个range。

2、还记得我们抓取基金网站内容的getData()函数?

def getData(start, end):
  for x in range(start, end+1):
    # 去第几页 输入框
    tonum = driver.find_element_by_id("tonum")
    # 去第几页 提交按钮
    jumpBtn = driver.find_element_by_id("btn_jump")
    tonum.clear() # 第x页 输入框
    tonum.send_keys(str(x)) # 去第x页
    jumpBtn.click() # 点击按钮
    WebDriverWait(driver, 20).until(lambda driver: driver.find_element_by_id("pager") \
                    .find_element_by_xpath("span[@value={0} and @class!='end page']".format(x)) \
                    .get_attribute("class").find("at") != -1)
    # 保存抓取到的html内容
    # 保存到html目录下
    with open("./htmls/{0}.txt".format(x),"wb") as f:
      f.write(driver.find_element_by_id("tableDiv").get_attribute("innerHTML").encode("utf8"))
      f.close()

函数是有2个参数:一个开始页码,一个结束页码,也就是从第start页,到第end页。

这2个参数实际上也是range

改造getData()函数如下(参数不同了):

# 循环抓取网页内容的函数
def getData(myrange):
  for x in myrange:
    # 去第几页 输入框
    tonum = driver.find_element_by_id("tonum")
    # 去第几页 提交按钮
    jumpBtn = driver.find_element_by_id("btn_jump")
    tonum.clear() # 第x页 输入框
    tonum.send_keys(str(x)) # 去第x页
    jumpBtn.click() # 点击按钮
    WebDriverWait(driver, 20).until(lambda driver: driver.find_element_by_id("pager") \
                    .find_element_by_xpath("span[@value={0} and @class!='end page']".format(x)) \
                    .get_attribute("class").find("at") != -1)
    # 保存抓取到的html内容
    # 保存到html目录下
    with open("./htmls/{0}.txt".format(x),"wb") as f:
      f.write(driver.find_element_by_id("tableDiv").get_attribute("innerHTML").encode("utf8"))
      f.close()

3、创建进程,把target设置为上面的getData()

# 初始range
r = range(1,int(total_page)+1)
# 步长
step = 10
myList = [r[x:x+step] for x in range(0,len(r),step)] # 把页面分段
# 创建进程
processList = []
if __name__ == "__main__":
  for r in myList:
    p = Process(target=getData,args=(r,))
    processList.append(p)
  # 开始执行进程
  for p in processList:
    p.start()

这样就有三个进程分别抓取。

4、多进程抓取基金网站多页内容完全代码:

# coding: utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from multiprocessing import Process
driver = webdriver.PhantomJS(executable_path=r"你phantomjs的可执行文件路径")
# 请求一个网址
driver.get("http://fund.eastmoney.com/fund.html")
page_text = driver.find_element_by_id("pager").find_element_by_xpath("span[@class='nv']").text
total_page = ''.join(filter(str.isdigit,page_text)) # 得到总共有多少页
# 循环抓取网页内容的函数
def getData(myrange):
  for x in myrange:
    # 去第几页 输入框
    tonum = driver.find_element_by_id("tonum")
    # 去第几页 提交按钮
    jumpBtn = driver.find_element_by_id("btn_jump")
    tonum.clear() # 第x页 输入框
    tonum.send_keys(str(x)) # 去第x页
    jumpBtn.click() # 点击按钮
    WebDriverWait(driver, 20).until(lambda driver: driver.find_element_by_id("pager") \
                    .find_element_by_xpath("span[@value={0} and @class!='end page']".format(x)) \
                    .get_attribute("class").find("at") != -1)
    # 保存抓取到的html内容
    # 保存到html目录下
    with open("./htmls/{0}.txt".format(x),"wb") as f:
      f.write(driver.find_element_by_id("tableDiv").get_attribute("innerHTML").encode("utf8"))
      f.close()
# 初始range
r = range(1,int(total_page)+1)
# 步长
step = 10
myList = [r[x:x+step] for x in range(0,len(r),step)] # 把页面分段
# 创建进程
processList = []
if __name__ == "__main__":
  for r in myList:
    p = Process(target=getData,args=(r,))
    processList.append(p)
  # 开始执行进程
  for p in processList:
    p.start()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python开发的小球完全弹性碰撞游戏代码
Oct 15 Python
Python中处理时间的几种方法小结
Apr 09 Python
深入解答关于Python的11道基本面试题
Apr 01 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
python中的常量和变量代码详解
Jul 25 Python
pymongo中group by的操作方法教程
Mar 22 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
pyqt5中动画的使用详解
Apr 01 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 #Python
Python3实现定时任务的四种方式
Jun 03 #Python
500行Python代码打造刷脸考勤系统
Jun 03 #Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 #Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 #Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 #Python
Python3 实现文件批量重命名示例代码
Jun 03 #Python
You might like
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Django框架下在视图中使用模版的方法
2015/07/16 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
施工安全协议书
2013/12/11 职场文书
个人自我评价分享
2013/12/20 职场文书
工地门卫岗位职责
2013/12/30 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
世界地球日活动总结
2015/02/09 职场文书
客房领班岗位职责
2015/02/11 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python