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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
跟老齐学Python之用while来循环
Oct 02 Python
Python守护进程(daemon)代码实例
Mar 06 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
python实现八大排序算法(2)
Sep 14 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
python代码过长的换行方法
Jul 19 Python
Django如何自定义分页
Sep 25 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
python全栈知识点总结
Jul 01 Python
pytorch使用指定GPU训练的实例
Aug 19 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 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
老生常谈js数据类型
2017/08/03 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
详解python中各种文件打开模式
2020/01/19 Python
python字典按照value排序方法
2020/12/28 Python
Python datetime模块的使用示例
2021/02/02 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
MIS软件工程师的面试题
2016/04/22 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
英文推荐信格式范文
2014/05/09 职场文书
小学师德师风整改措施
2014/10/27 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
风之谷观后感
2015/06/11 职场文书
导游词之安徽九华山
2019/09/18 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
Python中tkinter的用户登录管理的实现
2021/04/22 Python
python自然语言处理之字典树知识总结
2021/04/25 Python
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js