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模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
python 系统调用的实例详解
Jul 11 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
Python检测网络延迟的代码
May 15 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
Python列表list常用内建函数实例小结
Oct 22 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
python二元表达式用法
Dec 04 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
Django更新models数据库结构步骤
Apr 01 Python
详解运行Python的神器Jupyter Notebook
Jun 03 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微信红包API接口
2015/12/05 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
js获取系统的根路径实现介绍
2013/09/08 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
轮播的简单实现方法
2016/07/28 Javascript
用原生js做单页应用
2017/01/17 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
python简单实现基数排序算法
2015/05/16 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
Python如何实现强制数据类型转换
2019/11/22 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
秘书专业自荐信范文
2013/12/26 职场文书
自我评价范文分享
2014/01/04 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
中文专业自荐书
2014/06/29 职场文书
建筑管理专业求职信
2014/07/28 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
2014年团总支工作总结
2014/11/21 职场文书