抓取网页数据(如何实现一下爱帮网上佛山药店的分布列表【我爱写游记】)

优采云 发布时间: 2021-10-03 20:22

  抓取网页数据(如何实现一下爱帮网上佛山药店的分布列表【我爱写游记】)

  昨天我们用Jsoup技术实现了一个简单的爬虫。原理很简单。主要是先分析页面,获取条件,然后匹配url,使用穹顶分析的方式循环抓取我们需要的数据,这是一个简单的爬虫可以轻松实现。所以,昨天我们说昨天只爬取了一页数据,也就是第一页的数据。如果要获取分页的所有数据,应该怎么写呢?碰巧今天朋友找我帮忙买药,说她那里没有,于是查了佛山各大药店,利用刚刚学的爬虫技术,今天就明白了艾邦网上佛山药店经销名单。

  一、需求分析

  首先,我们登录爱邦网,选择城市区域,输入关键词。我们输入“pharmacy”,点击搜索按钮,我们打开控制台,观察header信息,如下图:

  

  

  通过观察我们可以看到请求的URL地址和参数;其实我们看地址栏就可以直接看到了。我们点击第二页,发现其他参数没有变化,只是参数p的值随着页码的变化而变化。所以,这样我们就可以知道每个页面的请求地址其实是一样的,只要改变p的值,然后我们看到页面总数只有8个页面,数据量不是大的。写一个循环 8 次。现在我们开始实现它,只是在昨天的代码的基础上改变它。

  二、开发

  1、我们首先需要改变我们的业务实现类,因为获取值的方式不同,如下图:

  

  我们要去的类是aide里面的内容,它也拿到了标签,但是我们观察到页面上有很多标签,需要拿到我们需要的,如下图所示:

  /*

* 提取结果中的链接地址和链接标题,返回数据

*/

for(Element result : results){

Elements links = result.getElementsByTag("a");//可以拿到链接

for(Element link : links){

if(link.siblingElements().hasClass("num")){

String id = link.siblingElements().text();

String linkText = link.text();

LinkTypeData data1 = new LinkTypeData();

if(id!=null && linkText!=null){

data1.setId(id);

data1.setLinkText(linkText);

}

datas.add(data1);

}

if(link.parent().parent().hasClass("part1")){

LinkTypeData data2 = new LinkTypeData();

String address = link.parent().siblingElements().text();

if(address!=null){

data2.setSummary(address);

}

datas.add(data2);

}

if(link.parent().siblingElements().tagName("span").hasClass("biztel")){

LinkTypeData data3 = new LinkTypeData();

String telnum = link.parent().siblingElements().tagName("span").text();

if(telnum!=null){

data3.setContent(telnum);

}

datas.add(data3);

}

}

// 对取得的html中的 出现问号乱码进行处理

/*linkText = new String(linkText.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ');

String id = link.parent().firstElementSibling().text();

id = new String(id.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ');

String address = link.parent().nextElementSibling().text();

address = new String(address.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ');

String code = link.parent().lastElementSibling().text();

code = new String(code.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ');*/

/*data.setSummary(address);

data.setContent(code);

data.setId(id);*/

}

return datas;

}

  我们根据昨天的代码进行了更改。这样就得到了我们想要的数据。

  三、测试

  接下来我们可以改变我们的测试类,我们需要循环8次,每次拿到数据都存储在一个新的集合中,最后再取出新的数据集合写入Excel。

<p>/**

* 不带查询参数

* @author AoXiang

* 2017年3月21日

*/

@org.junit.Test

public void getDataByClass() throws IOException{

List newList = new ArrayList();

for(int i=1;i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线