php get header url,php函数get_headers是HEAD请求还是GET请求

本文通过测试分析了PHP的get_headers函数在获取远程图片大小时的工作方式,发现该函数实际上是发送GET请求而非HEAD请求,导致整个图片内容也被请求。通过抓包工具确认了这一行为,并提出使用fsockopen或curl发起HEAD请求的解决方案。
摘要由CSDN通过智能技术生成

在做一个获取远程图片大小的功能时,因为只是要获取大小,所以不用下载整张图片,只需要获取头信息就可以了。在php手册上看到get_headers能直接返回头信息,非常高兴,一行代码就搞定了。可是疑问就来了,get_headers到底是不是HEAD请求呢?如果是GET请求,那不是还要下载图片吗?于是笔者针对这个问题,进行了测试。

测试过程

测试环境是ubuntu 12.04 桌面版,web服务器是apache,支持HEAD请求。

笔者在本地web根目录建立一个文件test.php,用get_headers来获取一张远程图片的头信息,代码如下:

$imageurl = 'http://127.0.0.1/1.png';

$headers = get_headers($imageurl);

其实图片也是本地的一张图片,但是确实是“远程”的,远程图片也可以理解为url地址的图片。

使用抓包工具tcpdump监听本地80端口:

sudo tcpdump -i lo -nnA 'src port 80'

而后访问test.php,抓到的包关键部分截图如下:

a20181459f15586066eb46cef16e438d.png

php函数get_headers测试抓包截图

可以很清楚的看到图片的内容也被请求回来了。最终确定下来get_headers是GET请求,如果要发起HEAD请求,可以使用fsockopen或者curl。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import csv import requests from lxml import etree #定义主程序入口 if name == "main": # 定义要爬取的网页链接 url = 'https://jn.lianjia.com/zufang/pg%d' # 请求header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57' } # 爬取源码数据 # 定义要爬取的数据字段 headers = ["区域", "小区名称", "户型", "面积(㎡)", "价格(元/月)"] path = "链家济南租房数据.csv" #打开CSV文件,使用csv.writer()函数创建一个csv.writer对象,用于写入CSV文件 with open(path, 'w', newline='') as f: csv_write = csv.writer(f) csv_head = ["区域", "小区名称", "户型", "面积(㎡)", "价格(元/月)"] csv_write.writerow(csv_head) # 用于循环爬取多个网页,其中range(85,101)表示需要爬取85-100页的租房信息 for num in range(85,101): # 使用字符串的format()方法将%d占位符替换成实际的页码num new_url = url.format(num) # 用request库获取网页源码数据 page_num1 = requests.get(url=new_url, headers=header) page_num1.encoding = ('utf-8') page_num = page_num1.text tree = etree.HTML(page_num) # # 使用xpath语法获取所有租房信息的父级标签对象 div_list = tree.xpath('//*[@id="content"]/div[1]/div[1]/div') with open(path, 'a', newline='') as f: # 循环处理每个租房信息的标签对象 csv_write = csv.writer(f) for div in div_list: quyu = div.xpath('./div/p[2]/a[1]//text()')[0] name = div.xpath('./div/p[2]/a[3]//text()')[0] area_text = div.xpath('./div/p[2]/text()')[4] #用来解决.split()出错 area = area_text.split()[0] if len(area_text.split()) > 0 else "" type = div.xpath('./div/p[2]/text()')[6].split()[0] place = div.xpath('./div//span/em/text()')[0] data_row = [quyu, name, type, area, place] csv_write.writerow(data_row) print("完成")改成先获取网页数爬网页数据
最新发布
06-11
要先获取网页数,可以通过访问链家网站的租房列表页面,获取页面中的总页数信息,然后再根据总页数进行循环爬取每一页的租房信息。具体实现可以参考以下代码: ```python import csv import requests from lxml import etree # 定义要爬取的网页链接 url = 'https://jn.lianjia.com/zufang/pg{}' # 请求header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57' } # 获取总页数 page_num1 = requests.get(url=url.format(1), headers=header) page_num1.encoding = ('utf-8') page_num = page_num1.text tree = etree.HTML(page_num) total_page = int(tree.xpath('//*[@id="content"]/div[1]/div[2]/div/@data-totalpage')[0]) # 定义要爬取的数据字段 headers = ["区域", "小区名称", "户型", "面积(㎡)", "价格(元/月)"] path = "链家济南租房数据.csv" # 打开CSV文件,使用csv.writer()函数创建一个csv.writer对象,用于写入CSV文件 with open(path, 'w', newline='') as f: csv_write = csv.writer(f) csv_head = ["区域", "小区名称", "户型", "面积(㎡)", "价格(元/月)"] csv_write.writerow(csv_head) # 循环爬取每一页的租房信息 for num in range(1, total_page+1): new_url = url.format(num) page_num1 = requests.get(url=new_url, headers=header) page_num1.encoding = ('utf-8') page_num = page_num1.text tree = etree.HTML(page_num) div_list = tree.xpath('//*[@id="content"]/div[1]/div[1]/div') with open(path, 'a', newline='') as f: csv_write = csv.writer(f) for div in div_list: quyu = div.xpath('./div/p[2]/a[1]//text()')[0] name = div.xpath('./div/p[2]/a[3]//text()')[0] area_text = div.xpath('./div/p[2]/text()')[4] area = area_text.split()[0] if len(area_text.split()) > 0 else "" type = div.xpath('./div/p[2]/text()')[6].split()[0] place = div.xpath('./div//span/em/text()')[0] data_row = [quyu, name, type, area, place] csv_write.writerow(data_row) print("第{}页完成".format(num)) print("全部完成") ``` 这样就可以先获取总页数,再循环爬取每一页的租房信息,将数据写入到CSV文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值