如何绕过豆瓣对java爬虫爬取图片的限制,来爬取豆瓣上每个电影的标签

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
爱前端,乐分享。
微博/FedFun
前端开发交流群:前端癖()
关注大数据、云计算、人工智能、IoT、移动开发领域
80 后程序员,从业十余年。
前五年漂泊广深从事金融、电信等企业级应用开发,近年就职京东成都研究院负责电商互联网应用相关架构与开发。
是一个除了写代码也爱写写文字的程序员,平时爱写写技术思考和技术人成长相关的文字。个人微信公众号 「瞬息之间」。很久以前写的用java爬取豆瓣电影数据的程序,使用httpclient进行网页请求,使用jsoup进行解析,注释很清楚,所以直接上代码:
(1)jar包:
(2)爬取类package
import org.apache.http.*;
import org.apache.http.client.methods.CloseableHttpR
import org.apache.http.client.methods.HttpG
import org.apache.http.impl.client.CloseableHttpC
import org.apache.http.impl.client.HttpC
import org.apache.http.util.EntityU
import org.jsoup.J
import org.jsoup.nodes.D
import org.jsoup.nodes.E
import org.jsoup.select.E
import java.io.*;
import java.util.ArrayL
publicclassRetrivePage {privatestatic CloseableHttpClient httpclient = HttpClients.createDefault();
//创建一个客户端privatestatic String filename = "d:"+File.separator+File.separator+"liudehua.html";
//定义输出html文件的路径privatestatic String outfile = "d:"+File.separator+File.separator+"liudehua.csv";
//定义输出csv文件的路径privatestaticboolean bfile = true;
// 定义控制输出file的boolean变量privatestaticboolean bdb = true;
// 定义控制输出file的boolean变量privatestatic ArrayList&String& datalist = new ArrayList&String&();
//定义Arraylist类集用来保存每一条数据的信息privatestatic String headtitle = "电影名称,上映时间,导演,演员,评价人数";
//打印的标题头privatestaticint countrs = 0;
//计数变量/**
* 下载页面
*/publicstatic String downloadPage(String url) throws Exception {
String htmlString = "";
//定义返回的String变量
HttpGet request = new HttpGet(url);
//请求资源
CloseableHttpResponse response = httpclient.execute(request);
//得到回应try {
System.out.println(response.getStatusLine());
//打印状态码
HttpEntity entity = response.getEntity();
//获得Entity对象
htmlString = EntityUtils.toString(entity);
//将Entity对象转化为字符串
EntityUtils.consume(entity);
//销毁对象
} finally {
response.close();
htmltoFile(htmlString);
//调用htmltoFile()方法在制定路径输出html文件return htmlS
* 输出html文件
*/publicstaticvoidhtmltoFile(String htmlString) throws Exception {
// 获得文件输出流
FileOutputStream output = new FileOutputStream(filename);
// 以utf-8编码的形式输出到文件(utf-8是中文编码,ISO-8859-1是英文编码)
output.write(htmlString.getBytes("utf-8"));
if (output != null) {
output.close();
* 获取所有豆瓣电影列表
* @throws Exception
*/publicstaticvoidgetDouBanList(String surl) throws Exception {
String html = RetrivePage.downloadPage(surl);
//通过url下载页面
html = html.replace("star clearfix","star_clearfix");
//用"star_clearfix"替代"star clearfix"
Document doc = Jsoup.parse(html);
// 解析获取Document对象
Element divNode = doc.getElementsByClass("grid_view").first();
//通过getElementsByClass方法获取class为"grid_view"的div节点对象
Elements liTag = divNode.select("li[class]");
//通过select选择器选择有class属性的li标签节点,返回Element元素的集合
String title,time,director,actor,
for (Element liNode : liTag) {
//对于liTag Element集合中的每一个元素liNode
Element dd = liNode.select("dd").first();
//取得liNode的第一个dd节点对象
title = dd.getElementsByTag("a").text();
//使用getElementsByTag方法,通过标签名称取得a标签节点对象,然后取其中的文本元素,即为电影名称
datalist.clear();
//添加每一条数据前先清空之前添加的内容(由于是循环添加,一定要清空前一次添加的内容)
datalist.add(title);
//将title(电影名称)添加进datalist集合
Element h6 = dd.select("h6").first();
//选择dd节点里面的第一个h6节点对象
Element a = h6.select("span").first();
//进一步选择h6节点对象的第一个span节点对象
time = a.text() ;
//取得第一个span节点对象的文本内容,初步取出时间
time = time.replace("(","");
//进一步处理文本内容,去掉左括号
time = time.replace(")","");
//进一步处理文本内容,去掉右括号
datalist.add(time);
//将time(上映时间)添加进datalist集合
Element dl = dd.select("dl").first();
//通过select选择器选择dd节点的第一个dl节点
Element d1 = dl.select("dd").first();
//通过select选择器选择dl节点的第一个dd节点if(d1!=null){
//因为有些电影导演数据可能为空,为空(null)时会出现异常,所以在这里进行处理,将null转化为"";
director = d1.text();
//获取d1的文本对象即为导演
director = "";
datalist.add(director);
//将director(导演)添加进datalist集合
Element d2 = dl.select("dd").last();
//通过select选择器选择dl节点的最后一个dd节点if(d2!=null){
actor = d2.text();
actor = "";
datalist.add(actor);
Element foot = liNode.getElementsByClass("star_clearfix").first();
////通过getElementsByClass方法获取class为"star_clearfix"的节点对象
Element span = foot.select("span").last();
//通过select选择器选择foot的最后一个span对象
amount = span.text();
//取得span里面的文本元素即为评论数量
datalist.add(amount);
outputRs();
//调用outputRs方法将datalist里面的每一条数据插入到数据库
* 输出到数据库
* @throws Exception
*/privatestaticvoidoutputRs() throws Exception {
String strout = "";
for (int i = 0; i & datalist.size(); i++) {
strout = strout + datalist.get(i) + ",";
//获取datalist集合中的每一条数据,串成一个字符串
if (bfile) {
FileWriter fw = new FileWriter(outfile, true);
//实例化文件输出流
PrintWriter out = new PrintWriter(fw);
//实例化打印流if (countrs == 0)
out.println(headtitle);
//输出头标题
out.println(strout);
//输出刚刚串起来的strout字符串
out.close();
//关闭打印流
fw.close();
//关闭输出流
countrs = countrs + 1;
System.out.println(countrs + "
" + strout);
//在命令行打印数据// 插入数据库if (bdb) {
CrawlDatatoBase.InsertProduct(datalist);
* 翻页爬取
* @throws Exception
*/publicstaticvoidskipPage(String surl) throws Exception{
String html = RetrivePage.downloadPage(surl);
Document doc = Jsoup.parse(html);
Element footDiv = doc.getElementsByClass("paginator").first();
//获取页码部分的div对象
Element footSpan = footDiv.getElementsByClass("next").first();
//获取class为"next"的节点对象用footSpan表示
Element footA = footSpan.select("a[href]").first();
//选择footSpan中第一个带有href属性的a节点对象,并用footA表示
String href = footA.attr("href");
//获得footA中href属性中的内容href
String http = "/celebrity/1054424/movies"+
//将"/celebrity/1054424/movies"和href拼接即为下一页面的url
Element thispage = doc.getElementsByClass("thispage").first();
//获取当前页码节点int end = Integer.parseInt(thispage.text());
//获取当前页码中的数字元素(String类型),并转化为int类型if(end==1){
getDouBanList(surl);
System.out.println("=========================="+1+"===================");
getDouBanList(http);
//爬取下一页面
System.out.println("=========================="+(end+1)+"===================");
//打印一行页面分隔符if(end&19){
skipPage(http);
//由于一共是19页,所以end小于19的时候循环爬取
System.out.println("页面已爬完");
* 测试代码
*/publicstaticvoidmain(String[] args) {
String strURL = "/celebrity/1054424/movies?sortby=time&format=pic&&qq-pf-to=pcqq.group";
CrawlDatatoBase.setConn();
skipPage(strURL);
//翻页爬取
CrawlDatatoBase.closeConn();
//关闭数据库
}catch(Exception e){
e.printStackTrace();
(3)数据库存储类package
import java.sql.*;
import java.util.ArrayL
import java.util.D
import java.text.SimpleDateF
publicclassCrawlDatatoBase {static C
* 将数据插入数据库
*/publicstaticbooleanInsertProduct(ArrayList&String& datalist){
Date now = new Date();
//获取当前日期
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
//通过指定格式实例化日期转化为字符串模板
String redate = dateFormat.format(now);
//用模板将Date类型日期格式化成字符串
datalist.add(redate);
//将日期加入datalist集合
String insql = "INSERT INTO doubanlist(title,time,director,actor,amount,redate) VALUES(?,?,?,?,?,?)";
//定义将执行插入操作的insql语句
PreparedStatement ps = conn.prepareStatement(insql);
//实例化PreparedStatement对象,预处理insql语句int
for(i=0;i&datalist.size();i++){
String strvalue = datalist.get(i);
//获取datalist集合中的每一条数据
ps.setString(i+1, strvalue);
//循环取得datalist中的数据并设置进VALUES中的?里面
int result = ps.executeUpdate();
//执行insql语句,若成功,则返回一个正数,否则返回0
ps.close();
//关闭PreparedStatement对象if(result&0){
//result大于0说明插入操作成功returntrue;
}catch(Exception e){
e.printStackTrace();
returnfalse;
publicstaticvoidsetConn(){
//调用getConnection方法连接数据库,增加安全性
conn = getConnection();
publicstaticvoidcloseConn(){
//关闭数据库连接try{
conn.close();
}catch(Exception e){
e.printStackTrace();
publicstatic Connection getConnection(){
Connection con = null;
String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义驱动类
String DBUSER = "root";
//定义用户名
String DBPASS = "diuge";
//定义数据库密码
String DBURL = "jdbc:mysql://localhost:3306/crawldemo";
//定义urltry{
Class.forName(DBDRIVER);
//加载数据库驱动类
con = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//连接数据库
}catch(Exception e){
System.out.println("数据库连接失败"+e.getMessage());
//如果连接失败,获取失败的信息
').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= i++) {
$numbering.append($('').text(i));
$numbering.fadeIn(1700);
以上就介绍了java 爬虫实现爬豆瓣电影数据并存入mysql数据库,包括了方面的内容,希望对MySql有兴趣的朋友有所帮助。
本文网址链接:/article/detail_421003.html
上一篇: 下一篇:

我要回帖

更多关于 爬虫爬取百度搜索结果 的文章

 

随机推荐