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简单实现基数排序算法
May 16 Python
python实现用户登陆邮件通知的方法
Jul 09 Python
python中异常捕获方法详解
Mar 03 Python
python3实现跳一跳点击跳跃
Jan 08 Python
实用自动化运维Python脚本分享
Jun 04 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
python 使用shutil复制图片的例子
Dec 13 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
python爬虫工具例举说明
Nov 30 Python
Python max函数中key的用法及原理解析
Jun 26 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
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
python中的闭包用法实例详解
2015/05/05 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
城市规划毕业生求职信
2013/10/10 职场文书
打架检讨书400字
2014/01/17 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang