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 字符串定义
Sep 25 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
python中reload(module)的用法示例详解
Sep 15 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
解读python如何实现决策树算法
Oct 11 Python
Python中作用域的深入讲解
Dec 10 Python
python读取目录下最新的文件夹方法
Dec 24 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
python opencv 图像拼接的实现方法
Jun 27 Python
python os.path.isfile 的使用误区详解
Nov 29 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
抓取YAHOO股票报价的类
2009/05/15 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
php中in_array函数用法探究
2014/11/25 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
php编程每天必学之验证码
2016/03/03 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
解读Django框架中的低层次缓存API
2015/07/24 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
python实现批量注册网站用户的示例
2019/02/22 Python
Python创建字典的八种方式
2019/02/27 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
银行员工辞职信范文
2014/01/20 职场文书
活动总结模板
2014/05/09 职场文书
白血病捐款倡议书
2014/05/14 职场文书
公司外出活动方案
2014/08/14 职场文书
元旦趣味活动方案
2014/08/22 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
安阳殷墟导游词
2015/02/10 职场文书