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 时间操作例子和时间格式化参数小结
Apr 24 Python
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
代码分析Python地图坐标转换
Feb 08 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
python绘制圆柱体的方法
Jul 02 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
python实现超市商品销售管理系统
Oct 25 Python
Python OpenCV 图像平移的实现示例
Jun 04 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.MVC的模板标签系统(五)
2006/09/05 PHP
php 文件上传类代码
2011/08/06 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
htm调用JS代码
2007/03/15 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
JavaScript实现职责链模式概述
2018/01/25 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
python实现银行账户系统
2021/02/22 Python
Ajax请求总共有多少种Callback
2016/07/17 面试题
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
银行委托书范本
2014/04/04 职场文书
团代会宣传工作方案
2014/05/08 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
安全生产标语大全
2014/10/06 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技