精华内容
下载资源
问答
  • 爬虫真的像别人说的那么强大,可以获取很多信息,帮助或者参考别人的内容,补全自己吗?实际上确实是可以实现的,但是大家不了解的是,除了被动让爬虫去爬取,很多网站都可有主动防御技能,比如,现在跟大家说的图片...

    6a5e9221c0deda403c23b6824b11b3b7.png

    爬虫真的像别人说的那么强大,可以获取很多信息,帮助或者参考别人的内容,补全自己吗?实际上确实是可以实现的,但是大家不了解的是,除了被动让爬虫去爬取,很多网站都可有主动防御技能,比如,现在跟大家说的图片验证问题,爬虫必须得去解决,不然没有办法可以进行下一步,解决操作如下所示:

    1、先安装一个pytesseract

    2、接着我们就打开一张图片,使用 pytesseract 识别。

    91740086f3a52d4fcdd134778d46c3ff.png

    代码如下:captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)

    输出结果:没有问题。

    3、我们在试试其他图片,如下所示

    5223d4f452326c134140a6755b46d1d2.png

    代码所示:captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)

    处理结果是有问题,也许是pytesseract没有办法处理噪点比较大的内容。

    4、首先进行图片灰度处理captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()

    5、在进行二值化def convert_img(img,threshold):    img = img.convert("L")  # 处理灰度    pixels = img.load()    for x in range(img.width):        for y in range(img.height):            if pixels[x, y] > threshold:                pixels[x, y] = 255            else:                pixels[x, y] = 0    return img

    6、调用一下convert_img(captcha,150)

    7、之后再跟第一个图片处理方式一样,就可以解决了哦~

    好啦,一般情况下,第一种方式,几行代码就可以处理完成,还有一些情况可以调用第二种方式,如果大家还想了解更多的学习知识,点击进入python学习网即可。

    您可能感兴趣的文章:

    展开全文
  • 一个牛人提供GIS源码(很好)

    千次下载 热门讨论 2010-08-25 22:49:21
    一个牛人提供GIS源码(很好 下面文字非本人所写,文件提到下载东西我全部放包里了。 最后礼物:校园多媒体系统和校园WEBGIS系统 为什么说是最后礼物,大概是因为我突然想这个blog不更新了。为什么呢?...
  • 引言​ 说到数据采集大家首先都会想到python,代码简洁,高效,很容易就可以实现数据采集。​ 那PHP如何实现数据采集呢?非常简单。概念​ 那什么是数据采集呢?...你可以简单理解为偷别人网站的数据。需...

    引言

    ​ 说到数据采集大家首先都会想到python,代码简洁,高效,很容易就可以实现数据采集。

    ​ 那PHP如何实现数据采集呢?非常简单。

    概念

    ​ 那什么是数据采集呢?以下是百度百科的介绍:

    ​ 数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术广泛应用在各个领域。

    你可以简单的理解为偷别人网站的数据。

    需要的扩展包

    这是一个PHP HTTP客户端,可以轻松发送HTTP请求并轻松与Web服务集成。

    安装方式:

    composer require guzzlehttp/guzzle:~6.0

    或者:

    在composer.json加入

    "require": {

    "guzzlehttp/guzzle": "~6.0"

    }

    }

    ​ QueryList是一个基于phpQuery的PHP通用列表采集类,得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,它让PHP做采集像jQuery选择元素一样简单。 QueryList的几个特点:

    学习简单:只有一个核心的API

    使用简单:用jQuery选择器来选择页面元素

    自带过滤功能,可过滤掉无用的内容

    支持无限层级嵌套采集

    采集结果直接以采集规则以列表的形式有序的返回

    支持扩展

    我们可以使用它来过滤html内容

    安装方式:

    composer require jaeger/querylist:V3.2.1

    采集案例

    我们以 LearnKu 社区为例,我们将采集社区的帖子信息,并把这些信息存入文件和存入mysql数据库。

    1.安装依赖

    在命令行输入以下命令

    composer init

    引入依赖

    {

    "require": {

    "guzzlehttp/guzzle": "~6.0@dev",

    "jaeger/querylist": "V3.2.1"

    },

    "autoload": {

    "psr-4": {

    "App\\": "app/"

    }

    }

    }

    安装依赖

    composer install

    2.采集类

    appHandleClientHandle.php

    namespace App\Handle;

    use GuzzleHttp\Client;

    use QL\QueryList;

    class ClientHandle

    {

    private $client;

    public function __construct()

    {

    $this->client = new Client(['verify' => false]);

    }

    public function queryBody($url, $rules)

    {

    $html = $this->sendRequest($url);

    $data = QueryList::Query($html, $rules)->getData(function ($item) {

    if (array_key_exists('link',$item)){

    $content = $this->sendRequest($item['link']);

    $item['post'] = QueryList::Query($content, [

    'title' => ['div.pull-left>span', 'text'],

    'review' => ['p>span.text-mute:eq(0)', 'text'],

    'comment' => ['p>span.text-mute:eq(1)', 'text'],

    'content' => ['div.content-body', 'html'],

    'created_at' => ['p>a>span', 'title'],

    'updated_at' => ['p>a:eq(2)', 'data-tooltip']

    ])->data[0];

    }

    return $item;

    });

    //查看采集结果

    return $data;

    }

    private function sendRequest($url)

    {

    $response = $this->client->request('GET', $url, [

    'headers' => [

    'User-Agent' => 'testing/1.0',

    'Accept' => 'application/json',

    'X-Foo' => ['Bar', 'Baz']

    ],

    'form_params' => [

    'foo' => 'bar',

    'baz' => ['hi', 'there!']

    ],

    'timeout' => 3.14,

    ]);

    $body = $response->getBody();

    //获取到页面源码

    $html = (string)$body;

    return $html;

    }

    }

    简单分析:

    __construct 构造函数中我们实例化了一个 guzzleClient,用来发起http请求的。

    sendRequest 是传入url,然后发起一个http请求并返回目标的html源码。

    queryBody,接收一个url,和需要采集的规则,这里不做延伸 queryList,只要会使用jquery,那相信你很快上手。

    public function queryBody($url, $rules)

    {

    //发起一个请求,接收html源码

    $html = $this->sendRequest($url);

    //将内容$html,和规则$rules 传给QueryList的静态方法Query处理,并获取数据。

    $data = QueryList::Query($html, $rules)->getData(function ($item) {

    //我首先获取的是列表页,然后通过列表的link链接再去获取文章的详细信息。

    //判断是否匹配到link

    if (array_key_exists('link',$item)){

    //获取详情页的html源码

    $content = $this->sendRequest($item['link']);

    //再交给QueryList 处理数据

    $item['post'] = QueryList::Query($content, [

    'title' => ['div.pull-left>span', 'text'],

    'review' => ['p>span.text-mute:eq(0)', 'text'],

    'comment' => ['p>span.text-mute:eq(1)', 'text'],

    'content' => ['div.content-body', 'html'],

    'created_at' => ['p>a>span', 'title'],

    'updated_at' => ['p>a:eq(2)', 'data-tooltip']

    ])->data[0];

    //采集到的是一个集合,所以我只取第一个 data[0]

    }

    return $item;

    });

    //查看采集结果

    return $data;

    }

    3. PDO类

    AppHandlePdoHandle.php

    我们使用PDO来操作数据库,这里我简单实现一个类

    namespace App\Handle;

    class PdoHandle

    {

    public $source;

    private $driver;

    private $host;

    private $dbname;

    private $username;

    private $password;

    /**

    * PdoHandle constructor.

    */

    public function __construct($driver = 'mysql', $host = 'localhost', $dbname = 'caiji', $username = 'root', $password = '')

    {

    $this->driver = $driver;

    $this->host = $host;

    $this->dbname = $dbname;

    $this->username = $username;

    $this->password = $password;

    $dsn = $this->driver . ':host=' . $this->host . ';dbname=' . $this->dbname;

    $this->source = new \PDO($dsn, $this->username, $this->password);

    $this->source->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

    }

    }

    相信都看得懂,就不介绍了

    4. 写入文件

    我们把采集到的内容,写入到文件里

    //设置请求时间无限制

    set_time_limit(0);

    //引入自动加载

    require '../vendor/autoload.php';

    //规则, 只取下标小于5的 也就是前5条数据

    $rules = [

    'title' => ['span.topic-title:lt(5)', 'text'],

    'link' => ['a.topic-title-wrap:lt(5)', 'href']

    ];

    //采集

    $url = "https://learnku.com/laravel";

    $client = new \App\Handle\ClientHandle();

    $data = $client->queryBody($url, $rules);

    //因为我们请求了两级,所以返回的数组需要处理成一级数组

    $data = array_map(function ($item) {

    return $item['post'];

    }, $data);

    //写入文件

    $handle = fopen('2.php','w');

    $str = "<?php \n".var_export($data, true).";";

    fwrite($handle,$str);

    fclose($handle);

    稍等几秒后,你就可以看到文件目录下多出个 2.php 的文件了,里面有数据代表采集成功~

    5. 写入数据库

    把采集到的内容写入到数据库里

    1. 创建表

    首先我们创建一张 posts表并有以下字段:

    `title`, `review`, `comment`, `content`,`created_at`,`updated_at`

    created_at 和 updated_at 建议不要强制为时间类型和必填,否则需要再处理以下数据

    2.操作

    set_time_limit(0);

    require '../vendor/autoload.php';

    $rules = [

    'title' => ['span.topic-title', 'text'],

    'link' => ['a.topic-title-wrap', 'href']

    ];

    $url = "https://learnku.com/laravel";

    $client = new \App\Handle\ClientHandle();

    $data = $client->queryBody($url, $rules);

    $data = array_map(function ($item) {

    return $item['post'];

    }, $data);

    //编写sql语句

    $sql = "INSERT INTO `posts`(`title`, `review`, `comment`, `content`,`created_at`,`updated_at`) VALUES";

    //再过滤下没有匹配到符合条件的特殊数据,避免入库的时候麻烦

    $data = array_filter($data,function($item){

    return count($item) == 6;

    });

    //重置数组下标

    sort($data);

    //组合sql语句

    foreach ($data as $key => $item) {

    //内容是有html标签的,所以我们要用 base64 处理下才能入库

    $item['content'] = base64_encode($item['content']);

    $value = "'" . implode("','", array_values($item)) . "'";

    $sql .= "($value)";

    if (count($data) - 1 != $key) {

    $sql .= ",";

    }

    }

    //采集

    $db = new \App\Handle\PdoHandle();

    try {

    $db->source->query($sql);

    echo '采集入库成功!';

    } catch (PDOException $exception) {

    echo $exception->getMessage();

    }

    骚等几秒钟后,你就可以看到网页上输出 ‘采集入库成功’ 的字样,那代表成功了~

    我们也可以只采集前几条,只需要重写$rules规则就行了

    例如:只取前5条,我们可以这样写。

    $rules = [

    'title' => ['span.topic-title:lt(5)', 'text'],

    'link' => ['a.topic-title-wrap:lt(5)', 'href']

    ];

    6. 读取数据

    利用PDO读取数据

    require '../vendor/autoload.php';

    $db = new \App\Handle\PdoHandle();

    //查询

    $sql = "select * from `posts` limit 0,10";

    $pdoStatement = $db->source->query($sql);

    $data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);

    foreach ($data as &$item){

    //给内容解密

    $item['content'] = base64_decode($item['content']);

    }

    var_dump($data);

    篇尾

    希望对在看的你有点收获吧,同时我也把它上传到了github,需要的伙伴可以拉下来看下。

    展开全文
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    知道人不多,但提起国内暴风影音,我想知道人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同是,暴风影音将Media Player Classic改成...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    知道人不多,但提起国内暴风影音,我想知道人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同是,暴风影音将Media Player Classic改成...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    知道人不多,但提起国内暴风影音,我想知道人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同是,暴风影音将Media Player Classic改成...
  • 我们在构建时考虑到了简单性,因此尽管它无法完成Jenkins可以做所有事情,但设置... 请阅读我们获取有关如何参与更多信息。 有什么问题吗 最好去处是。 如果您已经是邮件列表成员,则只需发送电子邮件至。
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    知道人不多,但提起国内暴风影音,我想知道人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同是,暴风影音将Media Player Classic改成...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    知道人不多,但提起国内暴风影音,我想知道人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同是,暴风影音将Media Player Classic改成...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    知道人不多,但提起国内暴风影音,我想知道人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同是,暴风影音将Media Player Classic改成...
  • vc++ 开发实例源码

    2014-12-16 11:25:17
    内部包含了atl控件开发以及如何应用,演示了COM包容与集合、自动化、事件和连接点、枚举器和集合以及线程管理等等。 ATL实现CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl调用方法 class ...
  • 一个在线教育平台,译文数据很重要吧,但被别人通过爬虫技术全部爬走了,那结果就是“凉凉”。再比说有个独立开发者想抄袭你产品,通过抓包和爬虫手段将你核心数据拿走,然后短期内做个网站和App,短期内...
  • 看完这篇,别人的开源项目结构应该能看懂了 上次谁说要Java开源项目来着?来! 分享几款适合初学者的C语言/C++开源项目 吵着要学AI的小伙伴,可以看看这些牛批的开源项目 再整理几个开源项目:练手/毕设/私活都不愁...
  • 以现在的眼光看,RSS相当于把每个网站当成了公众号,用户可以通过RSS阅读器,订阅自己喜欢的网站更新,与公众号不同的是,RSS无广告,无需登录,且无法收集用户信息,用户也不会被同质化信息封闭自己的知识体系。...
  • 在讲如何获取大厂面试机会之前,先来给大家科普/对比一下两个校招非常常见概念——春招和秋招。 招聘人数 :秋招多于春招 ; 招聘时间 : 秋招一般 7 月左右开始,大概一直持续到 10 月底。但是大厂(如 BAT)...
  • 我是如何在面试别人Spring事务时“套路”对方 我和阿里面试官一次“邂逅”(附问题详解) 一份还热乎蚂蚁金服面经(已拿Offer)!附答案!! 十道校招常见面试题 JVM必问知识点:类加载过程 迄今为止把同步/...
  • 搜了一下网络上别人封装HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用。 调用关系不清楚,结构有点混乱。所以也就萌生了自己封装HttpClient工具类想法。 要做就做最好,本工具类...
  • asp.net知识库

    2015-06-18 08:45:45
    如何获取MSSQLServer,Oracel,Access中数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然返回多条记录问题? Asp.net 利用OleDbGetOLEDBSchemaTable方法...
  • 实际上,学习和研究别人的源代码就属于此类。Chikofsky在本书的序中特别指出:阅读别人写的代码或者自己以前写的代码实际上也是逆向工程在起作用。  第二类是从没有源代码的程序出发,生成对应的源程序、系统结构...
  • reversing :逆向工程解密

    热门讨论 2012-09-04 11:40:49
    实际上,学习和研究别人的源代码就属于此类。Chikofsky在本书的序中特别指出:阅读别人写的代码或者自己以前写的代码实际上也是逆向工程在起作用。  第二类是从没有源代码的程序出发,生成对应的源程序、系统结构...
  • 实际上,学习和研究别人的源代码就属于此类。Chikofsky在本书的序中特别指出:阅读别人写的代码或者自己以前写的代码实际上也是逆向工程在起作用。 第二类是从没有源代码的程序出发,生成对应的源程序、系统结构以及...
  • Reversing:逆向工程揭密

    热门讨论 2010-06-21 17:27:22
    实际上,学习和研究别人的源代码就属于此类。Chikofsky在本书的序中特别指出:阅读别人写的代码或者自己以前写的代码实际上也是逆向工程在起作用。 第二类是从没有源代码的程序出发,生成对应的源程序、系统结构以及...
  • c#学习笔记.txt

    2008-12-15 14:01:21
    foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知副作用。此语句形式如下: foreach (type identifier in expression) statement 若要循环访问集合,集合必须满足特定...
  • 按照用人方要求以及自身具备但别人不怎么会领域去写技术栈,不用大篇幅地去罗列技术栈。你熟悉 React 话人家就默认你熟悉前端三大件了,更不用说用编辑器写代码、用 Git 提交代码、用 Ajax 请求...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    著名 EJB 领域顶尖专家 Richard Monson-Haefel 在其个人网站:www.EJBNow.com 中极力推荐 GoF 《设计模式》,原文 如下: Design Patterns Most developers claim to experience an epiphany reading this ...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

如何获取别人的网站源码