分类 web 下的文章

“web开发杂七杂八”

要读取网页上一个json内的数据内容,先将json内容保存为了多个json文件,然后将json字段提取出来保存在其他文件里面。

<?php
if(0)
{
 $prefix="rd";      
 $jsonfile = "rd-1.json,rd-2.json";
}
else
{
 $prefix="all"; 
 $jsonfile = "all-1.json,all-2.json,all-3.json,all-4.json,all-5.json,all-6.json,all-7.json,all-8.json";
}
$file = $prefix."-".date('Ymd').".txt"; 
$arr = explode(',', $jsonfile);
for($idx=0;$idx<count($arr);$idx++)
{
    $json=file_get_contents($arr[$idx]);
    $J=json_decode($json);   
    echo "通过下面的信息就可以获取里面的信息了</br>";  
    print_r($J);   
    printf(count($J->Data->users));
    for($i=0;$i<count($J->Data->users);$i++)
    {
        print_r($J->Data->users[$i]->name."\r\n"); 
        file_put_contents($file,$J->Data->users[$i]->name."\r\n", FILE_APPEND);
        
    }  
}
?> 

php 提取json字段 参考了下面这个

<?php   
$json=  
'{  
"item1":  
{"item11":{"n":"chenling","m":"llll"},"sex":"男","age":"25"},  
"item2":  
{"item21":"ling","sex":"女","age":"24"}  
}';    
$J=json_decode($json);   
echo "通过下面的信息就可以获取里面的信息了</br>";  
print_r($J);  
print_r("</br>");  
echo "测试访问对象内元素</br>";  
print_r($J->item1->item11->n."</br>");   
print_r($J->item1->sex."</br>");   
//注意不是标准的json  
print_r($J->item2->age."</br>");   
?>  

Referenced from:https://blog.csdn.net/zhoushengbin3/article/details/8174123
php 提取json字段 搜索到了下面这个

<?php
    $json = '{"state":"1","info":"登录成功"}';
    $arr = (array) json_decode($json,true);
    echo '状态码:'. $arr['state'];
 
    $json2 = '{"data":{"date":"2019-02-09","team":"第二学期"}}';
    $arr2 = (array) json_decode($json,true);
    echo '日期:'. $arr2['data']['date'].'学期:'.$arr2['data']['team'];
?>

Referenced from:https://blog.csdn.net/qq_17497931/article/details/87733372

把自定义http头放入hearders array, 然后用CURLOPT_HTTPHEADER设置。

$headers = array();
$headers[] = 'X-Apple-Tz: 0';
$headers[] = 'X-Apple-Store-Front: 143444,12';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$headers[] = 'Accept-Encoding: gzip, deflate';
$headers[] = 'Accept-Language: en-US,en;q=0.5';
$headers[] = 'Cache-Control: no-cache';
$headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';
$headers[] = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0';
$headers[] = 'X-MicrosoftAjax: Delta=true';

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

php curl set header 搜索到这个神奇的网站

<?php

$url = "https://reqbin.com/echo/post/json";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$headers = array(
   "Accept: application/json",
   "Content-Type: application/json",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$data = <<<DATA
{
  "Id": 78912,
  "Customer": "Jason Sweet",
  "Quantity": 1,
  "Price": 18.00
}
DATA;

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);

?>

php curl set header 实现抓取alexa.cn的代码

<?php
// 创建一个cURL句柄
for($id=1;$id<=100;$id++)
{
$ch = curl_init('http://www.alexa.cn/siterank/'.$id);

$headers = array();
$headers[] = 'Connection: keep-alive';
$headers[] = 'Upgrade-Insecure-Requests: 1';
$headers[] = 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9';
$headers[] = 'Referer: http://www.alexa.cn/siterank/1';
$headers[] = 'Accept-Language: zh-CN,zh;q=0.9';
$headers[] = 'Cookie: Hm_lvt_e2d6533b8d3c86a8202250d4989a2fe5=1627867451; Hm_lpvt_e2d6533b8d3c86a8202250d4989a2fe5=1627867596; PHPSESSID=h9tn42894io1vh1845d0p8lbg0';

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 执行
curl_exec($ch);

// 检查是否有错误发生
if(!curl_errno($ch))
{
 $info = curl_getinfo($ch);

 echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}

// Close handle
curl_close($ch);
}
?>

中间也遇到curl 库没有打开,没有安装curl库之类的错误, 一一解决就好了。

参数 CURLOPT_RETURNTRANSFER 是将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。CURLOPT_RETURNTRANSFER参数的作用是
把CRUL获取的内容赋值到变量。它默认是 0 直接返回获取的输出的文本流,有时候,我们要拿返回值来做判断或者做其他用途的话那就不太好了。所以,有的时候我们希望返回的内容作

为变量储存,而不是直接输出,那么该怎么做呢?本篇文章主要介绍了 php curl_exec()函数 CURL获取返回值的方法

其实CURLOPT_RETURNTRANSFER 可以设置,如果设置成CURLOPT_RETURNTRANSFER 1,它就将使用PHP curl获取页面内容或提交数据,作为变量储存,而不是直接输出。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

来自https://reqbin.com/req/php/xlzvgz1v/php-post-request的示例

<?php

$url = "https://reqbin.com/echo/post/json";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$headers = array(
   "Accept: application/json",
   "Content-Type: application/json",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$data = <<<DATA
{
  "Id": 78912,
  "Customer": "Jason Sweet",
  "Quantity": 1,
  "Price": 18.00
}
DATA;

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);

?>

curl获取页面内容, 不直接输出例子:

$url = 'https://const.net.cn';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch); // 已经获取到内容,没有输出到页面上。

curl_close($ch);

echo $response;

?>

当我们将CURLOPT_RETURNTRANSFER 设置成 1 的时候,页面是没有输出内容的,我们将获取的内容赋值给了一个变量$response ,用 echo 输出的变量$response。

html head区添加下列内容。

<meta name="referrer" content="no-referrer" />
<meta name="referrer" content="never"/>
<meta name="referrer" content="same-origin"/> 

Referrer-Policy - HTTP | MDN
update:2021-8-18
集成到 HTML
你也可以在 HTML 内设置 referrer 策略。例如,你可以用一个 name 为 referrer 的 <meta> 元素为整个文档设置 referrer 策略。

<meta name="referrer" content="origin">

或者用 a、area、img、iframe、script 或者 link 元素上的 referrerpolicy 属性为其设置独立的请求策略。

<a href="http://example.com" referrerpolicy="origin">

另外也可以在 <a><area> 或者 <link> 元素上将 rel 属性设置为 noreferrer。

<a href="http://example.com" rel="noreferrer">

Referenced from:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy

如果你要为那些策略未获广泛的浏览器支持的情况指定一种后备策略,使用逗号分隔的列表,并将希望使用的策略放在最后:

Referrer-Policy: no-referrer, strict-origin-when-cross-origin
在上面的场景中,no-referrer 仅在 strict-origin-when-cross-origin 不被浏览器支持的情况下被使用。

来几个防盗图片
https://pic1.zhimg.com/80/v2-e365d1c3e7f367b752ed52e743c1d66b_720w.jpg?source=1940ef5c
性感 图 site:zhihu.com
美女 site:csdn.net
还有一种更新型的反反盗链技术。
html img request
Set custom header for the request made from <img/> tag

<img src onerror="fetch('https://picsum.photos/200',{headers: {hello:'World!'}}).then(r=>r.blob()).then(d=> this.src=window.URL.createObjectURL(d));" />

看下效果

还有就是使用脚本的方案

var xhr = new XMLHttpRequest();
xhr.responseType = 'blob'; //so you can access the response like a normal URL
xhr.onreadystatechange = function () {
    if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
        var img = document.createElement('img');
        img.src = URL.createObjectURL(xhr.response); //create <img> with src set to the blob
        document.body.appendChild(img);
    }
};
xhr.open('GET', 'http://images.example.com/my_secure_image.png', true);
xhr.setRequestHeader('SecretPassword', 'password123');
xhr.send();

先上个图片链接地址:
http://b25.photo.store.qq.com/psu?/41e942eb-6e91-4b94-a736-196e663f1666/kForrvREu9pdwmv1F5WZwS4SnfKREXjL970lewz92Cc!/b/YeOjTRG3YAAAYpT39Q7%2AqQAA&a=29&b=25&bo=NwIfAwAAAAABAA4!&rf=viewer_4

正常引用QQ空间图片

QQ空间的url链接里面有个星号,这个要将星号urlencode为%2A替换掉就可以了。

QQ网站另一个经常使用的图片网址地址为如下:
http://img1.gtimg.com/15/1582/158224/15822423_980x1200_0.jpg

来个图片链接试试看。
QQ网站的图片