php与python实现的线程池多线程爬虫功能示例


Posted in PHP onOctober 12, 2016

本文实例讲述了php与python实现的线程池多线程爬虫功能。分享给大家供大家参考,具体如下:

多线程爬虫可以用于抓取内容了这个可以提升性能了,这里我们来看php与python 线程池多线程爬虫的例子,代码如下:

php例子

<?php
class Connect extends Worker //worker模式
{
public function __construct()
{
}
public function getConnection()
{
if (!self::$ch)
{
self::$ch = curl_init();
curl_setopt(self::$ch, CURLOPT_TIMEOUT, 2);
curl_setopt(self::$ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(self::$ch, CURLOPT_HEADER, 0);
curl_setopt(self::$ch, CURLOPT_NOSIGNAL, true);
curl_setopt(self::$ch, CURLOPT_USERAGENT, "Firefox");
curl_setopt(self::$ch, CURLOPT_FOLLOWLOCATION, 1);
}
/* do some exception/error stuff here maybe */
return self::$ch;
}
public function closeConnection()
{
curl_close(self::$ch);
}
/**
* Note that the link is stored statically, which for pthreads, means thread local
* */
protected static $ch;
}
class Query extends Threaded
{
public function __construct($url)
{
$this->url = $url;
}
public function run()
{
$ch = $this->worker->getConnection();
curl_setopt($ch, CURLOPT_URL, $this->url);
$page = curl_exec($ch);
$info = curl_getinfo($ch);
$error = curl_error($ch);
$this->deal_data($this->url, $page, $info, $error);
$this->result = $page;
}
function deal_data($url, $page, $info, $error)
{
$parts = explode(".", $url);
$id = $parts[1];
if ($info['http_code'] != 200)
{
$this->show_msg($id, $error);
} else
{
$this->show_msg($id, "OK");
}
}
function show_msg($id, $msg)
{
echo $id."\t$msg\n";
}
public function getResult()
{
return $this->result;
}
protected $url;
protected $result;
}
function check_urls_multi_pthreads()
{
global $check_urls; //定义抓取的连接
$check_urls = array( 'http://xxx.com' => "xx网",);
$pool = new Pool(10, "Connect", array()); //建立10个线程池
foreach ($check_urls as $url => $name)
{
$pool->submit(new Query($url));
}
$pool->shutdown();
}
check_urls_multi_pthreads();
python 多线程
def handle(sid)://这个方法内执行爬虫数据处理
pass
class MyThread(Thread):
"""docstring for ClassName"""
def __init__(self, sid):
Thread.__init__(self)
self.sid = sid
def run():
handle(self.sid)
threads = []
for i in xrange(1,11):
t = MyThread(i)
threads.append(t)
t.start()
for t in threads:
t.join()

python 线程池爬虫:

from queue import Queue
from threading import Thread, Lock
import urllib.parse
import socket
import re
import time
seen_urls = set(['/'])
lock = Lock()
class Fetcher(Thread):
  def __init__(self, tasks):
    Thread.__init__(self)
    self.tasks = tasks
    self.daemon = True
    self.start()
  def run(self):
    while True:
      url = self.tasks.get()
      print(url)
      sock = socket.socket()
      sock.connect(('localhost', 3000))
      get = 'GET {} HTTP/1.0\r\nHost: localhost\r\n\r\n'.format(url)
      sock.send(get.encode('ascii'))
      response = b''
      chunk = sock.recv(4096)
      while chunk:
        response += chunk
        chunk = sock.recv(4096)
      links = self.parse_links(url, response)
      lock.acquire()
      for link in links.difference(seen_urls):
        self.tasks.put(link)
      seen_urls.update(links)
      lock.release()
      self.tasks.task_done()
  def parse_links(self, fetched_url, response):
    if not response:
      print('error: {}'.format(fetched_url))
      return set()
    if not self._is_html(response):
      return set()
    urls = set(re.findall(r'''(?i)href=["']?([^\s"'<>]+)''',
               self.body(response)))
    links = set()
    for url in urls:
      normalized = urllib.parse.urljoin(fetched_url, url)
      parts = urllib.parse.urlparse(normalized)
      if parts.scheme not in ('', 'http', 'https'):
        continue
      host, port = urllib.parse.splitport(parts.netloc)
      if host and host.lower() not in ('localhost'):
        continue
      defragmented, frag = urllib.parse.urldefrag(parts.path)
      links.add(defragmented)
    return links
  def body(self, response):
    body = response.split(b'\r\n\r\n', 1)[1]
    return body.decode('utf-8')
  def _is_html(self, response):
    head, body = response.split(b'\r\n\r\n', 1)
    headers = dict(h.split(': ') for h in head.decode().split('\r\n')[1:])
    return headers.get('Content-Type', '').startswith('text/html')
class ThreadPool:
  def __init__(self, num_threads):
    self.tasks = Queue()
    for _ in range(num_threads):
      Fetcher(self.tasks)
  def add_task(self, url):
    self.tasks.put(url)
  def wait_completion(self):
    self.tasks.join()
if __name__ == '__main__':
  start = time.time()
  pool = ThreadPool(4)
  pool.add_task("/")
  pool.wait_completion()
  print('{} URLs fetched in {:.1f} seconds'.format(len(seen_urls),time.time() - start))

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
web方式ftp
Oct 09 PHP
php操作JSON格式数据的实现代码
Dec 24 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
May 04 PHP
php代码审计比较有意思的例子
May 07 PHP
php上传图片类及用法示例
May 11 PHP
PHP加密技术的简单实现
Sep 04 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 05 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 #PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 #PHP
基于php实现的php代码加密解密类完整实例
Oct 12 #PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
php 无限分类 树形数据格式化代码
Oct 11 #PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 #PHP
You might like
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
人力资源专业推荐信
2013/11/29 职场文书
优乐美广告词
2014/03/14 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
学籍证明模板
2014/11/21 职场文书
浅谈Python 中的复数问题
2021/05/19 Python