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实现感知器算法详解
Dec 19 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
numpy matrix和array的乘和加实例
Jun 28 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
python实现连续图文识别
Dec 18 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
深入探讨opencv图像矫正算法实战
May 21 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
PHP脚本的10个技巧(4)
2006/10/09 PHP
PHP中MD5函数使用实例代码
2008/06/07 PHP
php自动加载的两种实现方法
2010/06/21 PHP
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
多广告投放代码 推荐
2006/11/13 Javascript
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python中atexit模块的基本使用示例
2015/07/08 Python
python基础教程之匿名函数lambda
2017/01/17 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
会计自荐信范文
2014/03/09 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书