日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬取分页数据_爬虫抓取分页数据的简单实现

發(fā)布時間:2023/12/31 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬取分页数据_爬虫抓取分页数据的简单实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

昨天,我們已經(jīng)利用Jsoup技術實現(xiàn)了一個簡單的爬蟲,原理很簡單,主要是要先分析頁面,拿到條件,然后就去匹配url,采用dome解析的方式循環(huán)抓取我們需要的數(shù)據(jù),從而即可輕松實現(xiàn)一個簡單的爬蟲。那么,昨天我們說了,我們昨天只是爬取了一頁的數(shù)據(jù)也就是第一頁的數(shù)據(jù),若想獲取分頁的全部數(shù)據(jù)該怎么寫呢?正好,今天朋友托我?guī)兔I一種藥,說是她那邊沒有,于是,我就查詢了一下佛山的各大藥店,利用我們剛學的爬蟲技術,我們今天就來實現(xiàn)一下愛幫網(wǎng)上佛山藥店的分布列表。

一、需求分析

首先,我們登陸愛幫網(wǎng),選擇城區(qū)以及輸入關鍵字,我們輸入的是“藥店”,點擊搜索按鈕,我們打開控制臺,觀察頭信息,如下圖:

我們通過觀察可以看到請求的url地址以及參數(shù);其實直接看地址欄就可以看得出來,我們點擊第二頁發(fā)現(xiàn)其他參數(shù)都不變,只有參數(shù)p的值隨頁碼的變化而變化。那么,這樣以來,我們就可以知道每一頁的請求地址其實都是一樣的,只要改變p的值即可,然后我們看頁面總頁數(shù)只有8頁,數(shù)據(jù)量不大,寫個循環(huán)循環(huán)8次即可。下面我們就來開始實現(xiàn),依然在昨天的代碼的基礎上改一改即可。

二、開發(fā)

1、我們首先需要改一下我們的業(yè)務實現(xiàn)類,因為取值的方式已經(jīng)不一樣了,如下圖:

我們要去的class為aside中的內(nèi)容,同樣是拿到標簽,但是我們觀察得知頁面有很多的標簽,我們要取得我們需要的,如下圖:

/** 提取結果中的鏈接地址和鏈接標題,返回數(shù)據(jù)*/

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= newLinkTypeData();if(id!=null && linkText!=null){

data1.setId(id);

data1.setLinkText(linkText);

}

datas.add(data1);

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

LinkTypeData data2= newLinkTypeData();

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= newLinkTypeData();

String telnum= link.parent().siblingElements().tagName("span").text();if(telnum!=null){

data3.setContent(telnum);

}

datas.add(data3);

}

}//對取得的html中的?出現(xiàn)問號亂碼進行處理

/*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);*/}returndatas;

}

我們在昨天的代碼基礎上進行了更改。這樣就取得了我們想要的數(shù)據(jù)。

三、測試

接下來我們就可以改一下我們的測試類,我們需要循環(huán)8次,而每一次獲取到的數(shù)據(jù)我們都存進一個新的集合中,然后最后再拿出新的集合的數(shù)據(jù)寫進Excel。

/*** 不帶查詢參數(shù)

*@authorAoXiang

* 2017年3月21日*/@org.junit.Testpublic void getDataByClass() throwsIOException{

List newList = new ArrayList();for(int i=1;i<=8;i++){

Rule rule= new Rule( "http://www.aibang.com/?area=bizsearch2&cmd=bigmap&city=%E4%BD%9B%E5%B1%B1&a=%E5%8D%97%E6%B5%B7%E5%8C%BA&q=%E8%8D%AF%E5%BA%97&as=5000&ufcate=&rc=1&zone=&quan=&fm=&p="+i,null,null,"aside", Rule.CLASS, Rule.POST);

List datas =ExtractService.extract(rule);for(int j=0;j

newList.add(datas.get(j));

}

}//第一步,創(chuàng)建一個webbook,對應一個Excel文件

HSSFWorkbook wb = newHSSFWorkbook();//第二步,在webbook中添加一個sheet,對應Excel文件中的sheet

HSSFSheet sheet = wb.createSheet("佛山藥店");//第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數(shù)列數(shù)有限制short

HSSFRow row = sheet.createRow((int) 0);//第四步,創(chuàng)建單元格,并設置值表頭 設置表頭居中

HSSFCellStyle style =wb.createCellStyle();

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//創(chuàng)建一個居中格式

HSSFCell cell = row.createCell((short) 0);

cell.setCellValue("序號");

cell.setCellStyle(style);

cell= row.createCell((short) 1);

cell.setCellValue("藥店名稱");

cell.setCellStyle(style);

cell= row.createCell((short) 2);

cell.setCellValue("地址");

cell.setCellStyle(style);

cell= row.createCell((short) 3);

cell.setCellValue("電話");

cell.setCellStyle(style);for(int m=0;m

row = sheet.createRow((int)m + 1);//第四步,創(chuàng)建單元格,并設置值

row.createCell((short) 0).setCellValue(newList.get(m).getId());

row.createCell((short) 1).setCellValue(newList.get(m).getLinkText());

row.createCell((short) 2).setCellValue(newList.get(m).getSummary());

row.createCell((short) 3).setCellValue(newList.get(m).getContent());

}//第六步,將文件存到指定位置

try{

FileOutputStream fout= new FileOutputStream("F:/佛山藥店.xls");

wb.write(fout);

fout.close();

}catch(Exception e)

{

e.printStackTrace();

}

}

我們運行一下看結果:

好了,我們已經(jīng)拿到我們需要的數(shù)據(jù)了,然后就可以對這些數(shù)據(jù)進行分析,為我么所用。

其實,這只是一個簡單的網(wǎng)站,一般現(xiàn)在的網(wǎng)站有些分頁是JS動態(tài)獲取的,我們看不到分頁信息,那么,這就需要我們靈活應變,爬蟲技術也不是只有這一種,然而萬變不離其宗,掌握了要領和方法,相信不會有任何困難。

源碼就不用上傳了,有興趣的同學可以參考一下,其實就是改了兩處地方。

如果您對代碼有什么異議歡迎您的留言,我們一起交流!

總結

以上是生活随笔為你收集整理的python爬取分页数据_爬虫抓取分页数据的简单实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。