php 网页内容抓取(几天有事没怎么研究,最开始用的爬虫爬虫想爬取携程)
优采云 发布时间: 2022-02-13 15:06php 网页内容抓取(几天有事没怎么研究,最开始用的爬虫爬虫想爬取携程)
在过去的几天里,我没有做太多的研究。我一开始用的java爬虫尝试爬取携程,但是失败了。
主要表现在:
1. 对应的标签无法捕获,jsoup语法对应的元素个数为0。推测使用get方法直接获取票证信息时,网站没有显示与价格信息相关的元素。所以拿不到。
2.捕获的数据有误。价格与实际标价相差甚远。
据说像去哪儿、协诚这样的网站都在反爬虫方面下功夫。为了达到目的,我也做了一些尝试。屡败屡战后,修改爬虫代码和思路。今天尝试用phantomjs做爬虫,爬取成功。phantomjs脚本文件的代码好像是js代码,类似JAVA,上手容易。
方法1.访问下一个浏览器的user-agent切换插件网站的手机版,将代理改为手机浏览器。然后像往常一样执行爬虫任务。手机网页比电脑版更简单,更容易掌握,但还是失败了。
2.方法添加请求头伪装浏览器,与真实浏览器相差太大,无效,失败。
方法3.既然我不向非浏览器发送数据,那我就用真正的浏览器,phantomjs开源浏览器内核,说白了就是一个没有GUI的浏览器,需要通过操作台和代码行,好处当然是开源的东西,可以集成成你想要的功能,比如爬虫。
暂时放下之前的java爬虫,用phantomjs做一个小爬虫,专门爬机票。最后经过尝试,成功。暂时试试吧,代码很简单,参考API写的:
var page = require('webpage').create();
phantom.outputEncoding="gbk";
page.open('http://flights.ctrip.com/booking/XMN-BJS-day-1.html?DDate1=2017-02-18', function (status) {
var flight = page.evaluate(function () {
return document.getElementById('J_flightlist2').textContent;
});
console.log(flight);
phantom.exit();
});
捕获的数据如下:
因为和jsoup的用法有点不一样,暂时没写下来,直接抓了一小段数据,看起来有点复杂,还是抓不到标签的价格位置直接。整个数据加载已经实现。据推测,携程的反爬规则应该只在加载无关标签后才显示价格。后续提取没有问题。既然已经获取了数据,过滤起来就不难了。如果有进展,再次跟进文章。
尖端:
使用phantomjs时,返回cmd命令行的中文数据是乱码。这个问题是因为有些网站使用GBK编码,而phantomjs的默认编码是UTF-8。在代码行代码中插入以下语句,可以改变编码来解决中文乱码问题。
phantom.outputEncoding="gbk"; 修改输出编码,解决中文乱码问题。