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 相关文章推荐
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
php GeoIP的使用教程
Mar 09 PHP
PHP中strtotime函数使用方法详解
Nov 27 PHP
PHP eval函数使用介绍
Dec 08 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
thinkphp5实现无限级分类
Feb 18 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
Python中的Numpy入门教程
2014/04/26 Python
Python实现拼接多张图片的方法
2014/12/01 Python
Python中的日期时间处理详解
2016/11/17 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
生日礼品店创业计划书范文
2014/03/21 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
干部作风建设工作总结
2014/10/29 职场文书
公司出纳岗位职责
2015/03/31 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
Oracle表空间与权限的深入讲解
2021/11/17 Oracle