抓取网页数据(如何实现一下爱帮网上佛山药店的分布列表【我爱写游记】)
优采云 发布时间: 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