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脚本实现代码行数统计代码分享
Mar 10 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
python数据结构之列表和元组的详解
Sep 23 Python
python实现神经网络感知器算法
Dec 20 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
Python类及获取对象属性方法解析
Jun 15 Python
python中的垃圾回收(GC)机制
Sep 21 Python
python中print格式化输出的问题
Apr 16 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
二招解决php乱码问题
2012/03/25 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python数据结构之图的应用示例
2018/05/11 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
python 获取图片分辨率的方法
2019/01/08 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
python ubplot使用方法解析
2020/01/10 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
爱国主义教育活动总结
2014/05/07 职场文书
核心价值观演讲稿
2014/05/13 职场文书
娱乐节目策划方案
2014/06/10 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
会议室使用管理制度
2015/08/06 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书