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 05 Python
Python发送email的3种方法
Apr 28 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
Python hashlib模块用法实例分析
Jun 12 Python
python3.5基于TCP实现文件传输
Mar 20 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
Python如何在循环内使用list.remove()
Jun 01 Python
Python3爬虫发送请求的知识点实例
Jul 30 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 Python
python 管理系统实现mysql交互的示例代码
Dec 06 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
对盗链说再见...
2006/10/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
php递归创建目录的方法
2015/02/02 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
Python 实现链表实例代码
2017/04/07 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
python在不同条件下的输入与输出
2020/02/13 Python
python为什么会环境变量设置不成功
2020/06/23 Python
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
《雪儿》教学反思
2014/04/17 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
党性分析材料格式
2014/12/19 职场文书
志愿者个人总结
2015/03/03 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android