python携程酒店数据爬取_⼩⽼弟,来爬取携程的民宿酒店数
据啦(附带源码).md...
今天接到个需求,⼀个同学需要我帮忙爬取⼀下携程的民宿酒店数据。都知道携程难爬,我⼀不⼩⼼就掉坑⾥了。
其实携程难爬的数据是酒店数据,⽽这个民宿应该是个新上线的业务,所以并没有做什么反爬⼿段,可惜⽼夫不知道啊,所以从中午接到电话就开始了折腾之路。
第⼀阶段:⼈⽣苦短,我⽤python
刚⼀听到这个需求,就想⽤python来做,所以先装python环境,⼜装了pycharm,了⼏个脚本,基本都是跑不起来,要么是库安装不了,要么是语法不对。鉴于本⼈的渣渣python⽔平,在捣⿎了⼀两个⼩时后放弃了。中间的坑主要是库不对,我cmd窗⼝安装的库和pycharm的库不是通⽤的,cmd各种库都能装,pycharm有个别库搜索不到,所以,你懂得。。。
第⼆阶段:搜索java解决⽅案
java的⽅案⽐较多,这⼀阶段主要是⽹上搜索各种demo,了那么五六个,甚⾄还在csdn⽤积分下载了
两个,可惜由于代码基本都是去年的,请求的路径还是aspx,最新的携程已经不是这个了,到的所有的教程都是基于这种⽅式的,所以根本也都⽤不了。
ps:中间还⽤了下*Chrome*driver⽅案,但教程是爬取艺龙的,能⽤,放弃。
还有很多教程,没有完整代码,拷贝过来并不能运⾏,还有⼏个是⼴告贴,让买⼀个什么携程海内外酒店爬⾍系统,未付费只能爬⼗条,可惜注册的页⾯⼿机号码都输⼊不了,放弃。
搞到这个时候,⼀下午基本已经过去了,这时候同学打电话过来,他已经⼈⾁完了,所以,彻底在他⾯前丢⼈了。
其实,⼀直陷⼊到了误区中,到了这个阶段,我⼀直以为携程的很难爬,所以跟⼩伙伴聊了⼀下,直接到请求的地址,拿apidebug进⾏了测试,看到post请求中⼗⼏个请求头,请求参数也是⼀⼤堆,弄的真是⼼⼒交瘁。最后也测试通过了,证明根据这个路径可以爬,⽽且他返回的是json数据。此时下班了。。。。
第三阶段:jsoup,webmagic⽅式
回家后继续折腾,之前⽤过jsoup爬过医药⾏业的信息,所有还是按这个思路,各种搭环境,demo代码,中间也试了webmagic,都差不多。搞到⼀半突然反应过来了,这两个⼯具都是解析静态页⾯的,
可⽼夫不需要解析页⾯啊,⼈家携程已经很友好地通过接⼝返回json数据了,我这还弄个⽑的html解析啊,于是,⾥⾯⼜转换思路。
第四阶段:httpclient终极⼤招
想明⽩了这个问题,其实就是发送个http请求,然后解析得到的json数据转换成对象,存到数据库就ok了。所以就是最后的直接发送http的post请求阶段,代码如下:
pom依赖:
```html
org.apache.httpcomponents
httpclient
4.3.1
mysql
mysql-connector-java
5.1.34
com.alibaba
fastjson
1.2.31
```
![点击并拖拽以移动]
(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) java实体类
```java
package cn.wanghaomiao;
import java.util.Date;
/**
* @Author: szzpython请求并解析json数据
* @Date: 2019/5/29 下午9:50
* @Version 1.0
*/
public class Hotel {
String id;
String pid;
String pname;
String zone;
String lng;
String lat;
String zoneId;
String rname;
Date createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPid() {
return pid;
compiler编译器下载
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) { this.pname = pname;
}
public String getZone() {
return zone;
}
public void setZone(String zone) { = zone;
}
public String getLng() {
return lng;
}
public void setLng(String lng) {
this.lng = lng;
}
public String getLat() {
return lat;
}
public void setLat(String lat) {
this.lat = lat;
}
public String getZoneId() {
return zoneId;
}
public void setZoneId(String zoneId) { Id = zoneId;
}
public String getRname() {
return rname;
}
public void setRname(String rname) {
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
}
@Override
前端常用的框架
public String toString() {
return "Hotel{" +
"pid='" + pid + '\'' +
", pname='" + pname + '\'' +
", zone='" + zone + '\'' +
", lng='" + lng + '\'' +
", lat='" + lat + '\'' +
", rname='" + rname + '\'' +
oracle数据库学习视频
", zoneId='" + zoneId + '\'' +
'}';
}
}
```
![点击并拖拽以移动]
(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)操作类
```java
package cn.wanghaomiao;
import ch.SyslogOutputStream;
import com.alibaba.fastjson.JSONObject;
json校验通过是什么意思sql.jdbc.Connection;
sql.jdbc.PreparedStatement;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.ity.UrlEncodedFormEntity;
import org.apache.hods.CloseableHttpResponse;
import org.apache.hods.HttpPost;
import org.fig.Registry;
安装mysql没有框架
import org.fig.RegistryBuilder;
import org.socket.ConnectionSocketFactory;
import org.socket.PlainConnectionSocketFactory; import org.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.PoolingHttpClientConnectionManager; import org.ssage.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import javax.ssl.SSLContext;
import javax.ssl.TrustManager;
import javax.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import CertificateException;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.*;
/**
* 简单httpclient实例
*
* @author szz
* @date 2019年05⽉29⽇ 下午6:36:49
* @version 1.0
*/
public class SimpleHttpClientDemo {
/**
* 绕过验证

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。