① 寫一個新聞閱讀app,怎麼從其他網站獲取新聞
技術上來講毫無難點。具體實現步驟如下:
連接新聞網站的首頁
抓取HTML的內容
解析抓取的HTML網頁中的標題以及文章鏈接
將所有標題顯示在當前頁,並將標題以及文章鏈接傳到下一個頁面
抓取文章鏈接內容,和上頁傳來的標題一起顯示在當前頁
看的再多不如動手一試
由於快點看出效果,所以一切就從簡了。直接建立Android項目,建立空的Activity。然後在你的layout的這個文件中加入一個按鈕。比如像這樣蔽岩枯:
<Button
android:id="@+id/button1"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignLeft="@+id/button2"
android:background="@drawable/button"
android:text="Business Insider" />
然後在MainActivity里的onCreateView函數里加入一個方法,讓它能點擊你剛剛添加的按鈕進入到下一個界面:
1 rootView.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
2
3 @Override
4 public void onClick(View v) {
5 // TODO Auto-generated method stub
6 StartGeek();
7 }
8
9 });
點擊按鈕會觸發事件,執行StartGeek的方法,而StartGeek的方法則是跳到下一個Activity,
1 private void StartGeek() {
2 // TODO Auto-generated method stub
3 Intent intent = new Intent();
4 intent.setClass(this.getActivity(), GeekActivity.class);
5 startActivity(intent);
6
7 }
StartGeek
在這個Activity中,我們將訪問網頁,並從中獲取HTML網頁的內容,然後進行解析,獲取新聞的標題以及鏈接,然後將新聞的標題顯示在手機屏幕上,代碼具體宏洞實現如下:
1 ListView listview;
2 Handler handler;
3 List<Map<String, Object>> data;
4
5 final String CSDNURL = "http://tech.qq.com/bi.htm";
首先是變數的聲明,至於變數名的問題請隨意吐槽,因為一直在嘗試棗戚拿各種網站的新聞內容,所以變數名是最初的,由於懶就一直沒換-。 -,由於新聞網站的內容較多,所以用ListView比較合適,這樣不會出現顯示不全的情況。
1 @Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.activity_geek);
5 handler = getHandler();
6 ThreadStart();
7 }
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context="${packageName}.${activityClass}" >
6
7 <ListView
8 android:id="@+id/listView"
9 android:layout_width="wrap_content"
10 android:layout_height="fill_parent"
11 ></ListView>
12
13 </RelativeLayout>
activity_geek.xml
接下來是onCreate方法,這里界面是activity_geek,然後調用兩個方法,由於獲取數據費時,所以又起了一個線程,當然比較好的方法是用非同步線程來做,那樣的話不僅可以不佔用主線程,而且還可以很方便的加進度條什麼的,相當好用,至於我為什麼不用,當然是不會用了撒~
1 private void ThreadStart() {
2 new Thread() {
3 public void run() {
4 Message msg = new Message();
5 try {
6 data = getCsdnNetDate();
7 msg.what = data.size();
8 } catch (Exception e) {
9 e.printStackTrace();
10 msg.what = -1;
11 }
12 handler.sendMessage(msg);
13 }
14 }.start();
15 }
ThreadStart
這是新的線程,用於從網址獲取我們想要的HTML文件,並將其傳給handler處理。獲取的函數方法是:
1 data = getCsdnNetDate();
1 private List<Map<String, Object>> getCsdnNetDate() {
2 List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
3 Document doc = http_get(CSDNURL);
4 Elements links = doc.select("h3>a");
5 for(Element link: links)
6 {
7 Map<String, Object> map = new HashMap<String, Object>();
8 map.put("title", link.attr("title"));
9 map.put("url", link.attr("abs:href"));
10 result.add(map);
11 }
12
13
14 return result;
15 }
getCsdnNetDate
1 Document doc = http_get(CSDNURL);
1 private Document http_get(String url) {
2 Document doc=null;
3 try {
4 doc = Jsoup.connect(url)
5 .timeout(50000)
6 .get();
7 } catch (IOException e) {
8 // TODO Auto-generated catch block
9 e.printStackTrace();
10 }
11
12 return doc;
13 }
http_get
通過http_get方法中的Jsoup.connect來連接到網址,然後通過.get方法來獲得HTML的文本信息,設定的連接時間是5S,獲取到這個文本信息之後Jsoup還帶有解析方法,通過link.attr("title")來獲取HTML中的<title>標簽中的標題,然後再通過link.attr("abs:href")來獲取新聞中的鏈
接,由此,我們就獲得了HTML中最為重要的兩部分,也就是標題以及鏈接,事情到這里已經完成大半了,接下來就是將標題顯示在當前頁面,然後點擊標題後,能將標題以及文中內容顯示在下個頁面,處理的方法如下:
1 private Handler getHandler() {
2 return new Handler(){
3 public void handleMessage(Message msg) {
4 if (msg.what < 0) {
5 Toast.makeText(GeekActivity.this, "數據獲取失敗", Toast.LENGTH_SHORT).show();
6 }else {
7 initListview();
8 }
9 }
10 };
11 }
getHandler
此方法會判斷數據是否為空,若為空則在手機屏幕跳出:數據獲取失敗的字樣,當然了,喜歡什麼就改成什麼,隨你所想~然後成功獲取數據則會進入到initListview方法:
1 private void initListview() {
2 listview = (ListView)findViewById(R.id.listView);
3 SimpleAdapter adapter = new SimpleAdapter(this, data,
4 android.R.layout.simple_list_item_1, new String[] { "title"},
5 new int[] { android.R.id.text1 });
6 listview.setAdapter(adapter);
7
8
9 listview.setOnItemClickListener(new OnItemClickListener() {
10 @Override
11 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
12 long arg3) {
13 Map<String, Object> map = data.get(arg2);
14 String url = (String)(map.get("url"));
15 String title = (String)(map.get("title"));
16 Intent intent = new Intent();
17 intent.putExtra("url", url);
18 intent.putExtra("title", title);
19 intent.setClass(GeekActivity.this, ContentActivity.class);
20 startActivity(intent);
21 }
22 });
23 }
initListview
這個方法會將獲取的新聞標題顯示在當前頁面上,然後將新聞的標題以及鏈接保存下來,通過intent傳到下一個Activity,也就是ContentActivity進行處理,並將標題以及內容顯示在下一個頁面中。代碼的分下如下:
1 @Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.activity_content);
5
6 url = getIntent().getStringExtra("url");
7 String title = getIntent().getStringExtra("title");
8 TextView tv = (TextView)findViewById(R.id.title_content);
9 tv.setText(title);
10 handler = getHandler();
11 ThreadStart();
12 }
onCreate
onCreate方法中獲取上個Activity中傳過來的url以及title,然後直接將新聞標題顯示在當前頁,然後剩餘部分和上個方法差不太多,連接到網上,獲取HTML內容,這次在方法中僅僅是解析的方法不同,畢竟這次解析是要獲取內容嘛~代碼如下:
1 private List<Map<String, Object>> getCsdnNetDate() {
2 List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
3 Document doc = http_get(url);
4 Elements links = doc.select("div#Cnt-Main-Article-QQ>p");
5 for(Element link: links)
6 {
7 Map<String, Object> map = new HashMap<String, Object>();
8 map.put("title", link.text());
9 result.add(map);
10 }
11
12
13 return result;
14 }
標紅部分為與上次不同的部分,這個解析都是用的Jsoup自帶的,當然正則表達式也是可以做到的哦,咳咳,我承認我很懶的啊,有好用的工具就直接用了,省時省力的事幹嘛不用呢,就像寫網站有框架了自然就用了,不喜歡用的我也木有辦法,你可以使用正則表達式來做,話說以前用
Python做爬蟲的時候就是正則表達式做的。
至此一個小的新聞的閱讀APP就出世了,哦,對了,不要忘了在你的配置文件加入Activity以及上網許可,不然的話是會閃退的哦。當然這個APP很是粗糙,有時間的人可以將圖片也加上進行一下頁面的設計,做一下美工什麼的。
轉載
② python3 怎麼爬取新聞網站
需求:
從門戶網站爬取新聞,將新聞標題,作者,時間,內容保存到本地txt中。
用到的python模塊:
importre冊穗#正則表達式
importbs4#BeautifulSoup4解析模塊
importurllib2#網路訪問模塊
importNews#自己定義的新聞結構
importcodecs#解決編碼問題的關鍵,使用codecs.open打開文件
importsys#1解決不同頁面編碼問題
其中bs4需要自己裝一下,安裝方法可以參考:Windows命令行下pip安裝python whl包
程序:
#coding=utf-8
importre#正則表達式
importbs4#BeautifulSoup4解析模塊
importurllib2#網路訪問模塊
importNews#自己定義的新聞結構
importcodecs#解決編碼問題的關鍵,使用codecs.open打開文件
importsys#1解決不同頁面編碼問題
reload(sys)#2
sys.setdefaultencoding('utf-8')#3
#從首頁獲取所有鏈接
defGetAllUrl(home):
html=urllib2.urlopen(home).read().decode('utf8')
soup=bs4.BeautifulSoup(html,'html.parser')
pattern='http://w+.jia..com/article/w+'
links=soup.find_all('a',href=re.compile(pattern))
forlinkinlinks:
url_set.add(link['href'])
defGetNews(url):
globalNewsCount,MaxNewsCount#全局記錄新聞數量
whilelen(url_set)!=0:
try:
#獲取鏈接
url=url_set.pop()
url_old.add(url)
#獲取代碼
html=urllib2.urlopen(url).read().decode('utf8')
#解析
soup=bs4.BeautifulSoup(html,'html.parser')
pattern='http://w+.jia..com/article/w+'#鏈接匹配規則
links=soup.find_all('a',href=re.compile(pattern))
#獲取URL
forlinkinlinks:
iflink['href']notinurl_old:
url_set.add(link['href'])
#獲取信息
article=News.News()
article.url=url#URL信息
page=soup.find('div',{'id':'page'})
article.title=page.find('h1').get_text()#標題信息
info=page.find('肢姿伍div',{'class':'article-info'})
article.author=info.find('a',{'class':'name'}).get_text()#作者信息
article.date=info.find('span',{'class':'time'}).get_text()#日期信息
article.about=page.find('blockquote').get_text()
pnode=page.find('div',{'class':'article-detail'}).find_all('p')
article.content=''
fornodeinpnode:#獲取文章段落
article.content+=node.get_text()+' '#追加段落信息
SaveNews(article)
printNewsCount
break
歷或exceptExceptionase:
print(e)
continue
else:
print(article.title)
NewsCount+=1
finally:
#判斷數據是否收集完成
ifNewsCount==MaxNewsCount:
break
defSaveNews(Object):
file.write("【"+Object.title+"】"+" ")
file.write(Object.author+" "+Object.date+" ")
file.write(Object.content+" "+" ")
url_set=set()#url集合
url_old=set()#爬過的url集合
NewsCount=0
MaxNewsCount=3
home='http://jia..com/'#起始位置
GetAllUrl(home)
file=codecs.open("D:\test.txt","a+")#文件操作
forurlinurl_set:
GetNews(url)
#判斷數據是否收集完成
ifNewsCount==MaxNewsCount:
break
file.close()
新聞文章結構
#coding:utf-8
#文章類定義
classNews(object):
def__init__(self):
self.url=None
self.title=None
self.author=None
self.date=None
self.about=None
self.content=None
對爬取的文章數量就行統計。
③ 寫一個新聞閱讀app,怎麼從其他網站獲取新聞
技術上來講毫無難點。具體實現步驟如下:連接新聞網站的首頁抓取HTML的內容解析抓取的HTML網頁中的標題以及文章鏈接將所有標題顯示在當前頁,並將標題以及文章鏈接傳到下一個頁面抓取文章鏈接內容,和上頁傳來的標題一起顯示在當前頁鍵滑鬧看的再多不如動手一試由於快點看出效果,所以一切就從簡了。直接建立Android項目,建立空的Activity。然後在你的layout的這個文件中加入一個按鈕。比如像這樣:然後在MainActivity里的onCreateView函數里加入一個方法,讓它能點擊你剛剛添加的按鈕進入到下一個界面:1 rootView.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {2 3 @Override4 public void onClick(View v) {5 // TODO Auto-generated method stub6 StartGeek();7 }8 9 });點擊按鈕會觸發事件,執行StartGeek的方法,而StartGeek的方法則是跳到下一個Activity,1 private void StartGeek() {2 // TODO Auto-generated method stub3 Intent intent = new Intent();4 intent.setClass(this.getActivity(), GeekActivity.class);5 startActivity(intent);6 7 }StartGeek在這個Activity中,我們將訪問網頁,並從中讓中獲取HTML網頁的內容,然後進行解析,獲取新聞的標題以及鏈接,然後將新聞的標題顯示在手機屏幕上,代碼具體實現如下:1 ListView listview;2 Handler handler;3 List> data;4 5 final String CSDNURL = "/bi.htm"; 首先是變數的聲明,至於變數名的問題請隨意吐槽,因為一直在嘗試拿各種網站的新聞內容,所以變數名是最初的,由於懶就稿罩一直沒換-。 -,由於新聞網站的內容較多,所以用ListView比較合適,這樣不會出現顯示不全的情況。1 @Override2 protected void onCreate(Bundle savedInstanceState) {3 super.onCreate(savedInstanceState);4 setContentView(R.layout.activity_geek);5 handler = getHandler();6 ThreadStart();7 }1 6 7 12 13 activity_geek.xml接下來是onCreate方法,這里界面是activity_geek,然後調用兩個方法,由於獲取數據費時,所以又起了一個線程,當然比較好的方法是用非同步線程來做,那樣的話不僅可以不佔用主線程,而且還可以很方便的加進度條什麼的,相當好用,至於我為什麼不用,當然是不會用了撒~1 private void ThreadStart() { 2 new Thread() { 3 public void run() { 4 Message msg = new Message(); 5 try { 6 data = getCsdnNetDate(); 7 msg.what = data.size(); 8 } catch (Exception e) { 9 e.printStackTrace();10 msg.what = -1;11 }12 handler.sendMessage(msg);13 }14 }.start(); 15 }ThreadStart這是新的線程,用於從網址獲取我們想要的HTML文件,並將其傳給handler處理。獲取的函數方法是:1 data = getCsdnNetDate();1 private List> getCsdnNetDate() { 2 List> result = new ArrayList>(); 3 Document doc = http_get(CSDNURL); 4 Elements links = doc.select("h3>a"); 5 for(Element link: links) 6 { 7 Map map = new HashMap(); 8 map.put("title", link.attr("title")); 9 map.put("url", link.attr("abs:href"));10 result.add(map);11 }12 13 14 return result;15 }getCsdnNetDate1 Document doc = http_get(CSDNURL);1 private Document http_get(String url) { 2 Document doc=null; 3 try { 4 doc = Jsoup.connect(url) 5 .timeout(50000) 6 .get(); 7 } catch (IOException e) { 8 // TODO Auto-generated catch block 9 e.printStackTrace();10 }11 12 return doc;13 }http_get通過http_get方法中的Jsoup.connect來連接到網址,然後通過.get方法來獲得HTML的文本信息,設定的連接時間是5S,獲取到這個文本信息之後Jsoup還帶有解析方法,通過link.attr("title")來獲取HTML中的標簽中的標題,然後再通過link.attr("abs:href")來獲取新聞中的鏈接,由此,我們就獲得了HTML中最為重要的兩部分,也就是標題以及鏈接,事情到這里已經完成大半了,接下來就是將標題顯示在當前頁面,然後點擊標題後,能將標題以及文中內容顯示在下個頁面,處理的方法如下:1 private Handler getHandler() { 2 return new Handler(){ 3 public void handleMessage(Message msg) { 4 if (msg.what arg0, View arg1, int arg2,12 long arg3) {13 Map map = data.get(arg2);14 String url = (String)(map.get("url"));15 String title = (String)(map.get("title"));16 Intent intent = new Intent();17 intent.putExtra("url", url);18 intent.putExtra("title", title);19 intent.setClass(GeekActivity.this, ContentActivity.class);20 startActivity(intent);21 }22 });23 }initListview這個方法會將獲取的新聞標題顯示在當前頁面上,然後將新聞的標題以及鏈接保存下來,通過intent傳到下一個Activity,也就是ContentActivity進行處理,並將標題以及內容顯示在下一個頁面中。代碼的分下如下:1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_content); 5 6 url = getIntent().getStringExtra("url"); 7 String title = getIntent().getStringExtra("title"); 8 TextView tv = (TextView)findViewById(R.id.title_content); 9 tv.setText(title);10 handler = getHandler();11 ThreadStart();12 }onCreateonCreate方法中獲取上個Activity中傳過來的url以及title,然後直接將新聞標題顯示在當前頁,然後剩餘部分和上個方法差不太多,連接到網上,獲取HTML內容,這次在方法中僅僅是解析的方法不同,畢竟這次解析是要獲取內容嘛~代碼如下:1 private List> getCsdnNetDate() { 2 List> result = new ArrayList>(); 3 Document doc = http_get(url); 4 Elements links = doc.select("div#Cnt-Main-Article->p"); 5 for(Element link: links) 6 { 7 Map map = new HashMap(); 8 map.put("title", link.text()); 9 result.add(map);10 }11 12 13 return result;14 }標紅部分為與上次不同的部分,這個解析都是用的Jsoup自帶的,當然正則表達式也是可以做到的哦,咳咳,我承認我很懶的啊,有好用的工具就直接用了,省時省力的事幹嘛不用呢,就像寫網站有框架了自然就用了,不喜歡用的我也木有辦法,你可以使用正則表達式來做,話說以前用Python做爬蟲的時候就是正則表達式做的。至此一個小的新聞的閱讀APP就出世了,哦,對了,不要忘了在你的配置文件加入Activity以及上網許可,不然的話是會閃退的哦。當然這個APP很是粗糙,有時間的人可以將圖片也加上進行一下頁面的設計,做一下美工什麼的。轉載寫一個新聞閱讀app,怎麼從其他網站獲取新聞
④ 如何自動抓取網頁新聞內容
用前嗅的ForeSpider數據採集軟體,配置好新聞網站的模板之後,就可以一鍵採集了。軟體里有很多免費的採集模板,有很多新聞虧磨坦的模板,游沒都是免費的。
可以設置自動定時採集,或間隔固定時間採集,更新時會自動排重,只採集銷桐更新後的內容。