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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
php is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
php实现的常见排序算法汇总
Sep 08 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
yii2 url重写并隐藏index.php方法
Dec 10 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
ThinkPHP令牌验证实例
2014/06/18 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
python3抓取中文网页的方法
2015/07/28 Python
python Django框架实现自定义表单提交
2016/03/25 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python 统计字数的思路详解
2018/05/08 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
Python基于execjs运行js过程解析
2020/11/27 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
医生自荐信
2013/10/11 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
《荷花》教学反思
2014/04/16 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
民间借贷借条如何写
2015/05/26 职场文书