全球主机交流论坛

标题: python教程·一 [打印本页]

作者: nyqxmfj    时间: 2011-9-18 00:09
标题: python教程·一
2011·09·18 00:15更新:睡覺去了,還在論壇上的各位用力頂阿!前十位+分
順便求人品能追到CH!

本來應該發自己blog的 不過大陸那台免備硬碟掛了 先發 論壇上吧。
====================================================================
以下內容全部基於Python 2.7.2運行環境
嘛 廢話甚麼的最討厭了!直接開始:
Python是一門優雅的語言:
python程式碼的書寫相當優雅 不像傳統類C語言那樣用{}來控制程式運行。在python中 全部使用縮進符來控制 例如:
a="mjj"
b="ni"
if a=="mjj":
    print b, a


1、獲取HostLoc主頁
Python有很多方便的類庫,比如支援正則表達式的re類、urllib類等等。
因為本教程內容和網路關係較大,所以我們從urllib講起。
獲取一個網頁可以很簡單的用Python做到,只需要三行程式碼。是的,你沒有看錯 三行!
import urllib
hl=urllib.urlopen("http://loc.516000.xyz")
print hl.read()
將這段代碼保存成後綴名為py指令稿,或者在python IDE中運行,看看得到了甚麼?
如果沒有輸錯的話應該看到一大攤的數據 恩 HostLoc首頁的原始碼就被輸出了
2、獲取後的信息處理
那麼 你一定有個疑問。如果我想獲取HostLoc的標題怎麼辦呢?Python有個非常方便的HTML分析類:BeautifulSoup,不過那是分析複雜的HTML網頁用的,我們不需要那麼高端的類庫,於是我們用正則自己獲取。
如何引用正則類呢?很簡單:
import re
就這一行代碼。如果我們要同時引用正則類和urllib類的話 前面說過,Python的語法很優雅,因此你不需要打入兩行import。你只需要這樣:
import re, urllib

好吧= =我承認我說了很多廢話。接下來就是重頭戲了 用正則表達式截取標題。同樣只需要幾行代碼即可實現。
import re, urllib
hl=urllib.urlopen("http://loc.516000.xyz").read()
print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0]
如果正常的話 應該會顯示出一堆奇怪的字符,比如這樣:
' \xe9\x8d\x8f\xe3\x84\xa7\xe6\x82\x86\xe6\xb6\x93\xe7\xbb\x98\xe6\xba\x80\xe6\xb5\x9c\xe3\x82\x86\xe7\xa5\xa6\xe7\x92\x81\xe5\x93\x84\xe6\xbd\xa7 \xe7\xbc\x87\xe5\xba\xa1\xe6\xb5\x97\xe9\x8f\x88\xe5\xb6\x85\xe5\xa7\x9f\xe9\x8d\xa3\xe2\x95\x9b\xe7\xbc\x87\xe5\xba\xa1\xe6\xb5\x97VPS_\xe5\xa8\x86\xd1\x84\xe5\xba\x8a\xe9\x8f\x88\xe5\xb6\x85\xe5\xa7\x9f\xe9\x8d\xa3- Powered by Discuz!'

要怎麼讓它變成中文呢?很簡單,把
print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0]

改成
print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0].decode("gbk","ignore").encode("utf-8","ignore")

* 請注意 如果你通過ssh調試,並且沒有打開本地的utf-8支援或者漢字支援的話,看到的將是亂碼。如果你在本地用python調試就不會。
運行後將會輸出:
全球主机交流论坛 美国服务器_美国VPS_欧洲服务器 - Powered by Discuz!


好了 今天的教程到此結束。請期待明天的教程

[ 本帖最后由 nyqxmfj 于 2011-9-18 00:16 编辑 ]
作者: Ultratude    时间: 2011-9-18 00:09
沙发,细看。
作者: Poison    时间: 2011-9-18 00:10
还能勉强看懂
作者: neolee    时间: 2011-9-18 00:15
认真学习咯
作者: neverno    时间: 2011-9-18 00:16
mark LZ好人~
有点鸟哥的讲解风格,呆湾都是这么的?
作者: 有容乃大    时间: 2011-9-18 00:17
期待已久

这个东西 做好了 真的可以告别火车头。。
作者: mslxd    时间: 2011-9-18 00:22
不错,呵呵,,,不知道效率怎么样
作者: funkys    时间: 2011-9-18 00:23
不错,
作者: 誓誓    时间: 2011-9-18 00:30
收藏了
作者: qiqi13245    时间: 2011-9-18 01:53
2011·09·18 00:15更新:睡覺去了,還在論壇上的各位用力頂阿!前十位+分
順便求人品能追到CH!

本來應該發自己blog的 不過大陸那台免備硬碟掛了 先發 論壇上吧。
====================================================================
以下內容全部基於jdk 6u10運行環境
嘛 廢話甚麼的最討厭了!直接開始:

1、獲取HostLoc主頁
Java自帶有很多方便的支援庫,比如支援正則表達式的re類、urllib類等等,都在java.util下。
因為本教程內容和網路關係較大,所以我們從urllib講起。
獲取一個網頁可以很簡單的用Java做到!
  1. URL url = new URL("http://loc.516000.xyz"); //获取的地址
  2. Reader reader = new InputStreamReader(new BufferedInputStream(url.openStream()));
  3.         
  4. int c; //tmp
  5. String d = "";
  6. while ((c = reader.read()) != -1) {
  7. d = d + String.valueOf((char) c);   //将Chat Copy进String
  8. }reader.close();
  9. System.out.println(d);
复制代码
將這段代碼保存成後綴名為java指令稿,或者在java IDE (如eclipse netbeans等軟體)中運行,看看得到了甚麼?
如果沒有輸錯的話應該看到一大攤的數據 恩 HostLoc首頁的原始碼就被輸出了
2、獲取後的信息處理
那麼 你一定有個疑問。如果我想獲取HostLoc的標題怎麼辦呢?Java有非常方便的支援庫,不過那是分析複雜的HTML網頁用的,我們不需要那麼高端的類庫,於是我們用正則自己獲取。
如何引用正則類呢?很簡單:
  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
复制代码
好吧= =我承認我說了很多廢話。接下來就是重頭戲了 用正則表達式截取標題。同樣只需要幾行代碼即可實現。
Pattern pattern = Pattern.compile("(.+?)"); //正则规则
Matcher matcher = pattern.matcher(d); //应用正则
if(matcher.find()){
System.out.print("Title : ");
System.out.println(matcher.group(1)); //输出

如果正常的話 應該會顯示出一堆字符,比如這樣:
全球主机交流论坛 美国服务器_美国VPS_欧洲服务器 - Powered by Discuz!

* 請注意 如果你通過ssh調試,並且沒有打開本地的utf-8支援或者漢字支援的話,看到的將是亂碼。如果你在本地用Java調試就不會。
運行後將會輸出:

Title: 全球主机交流论坛 美国服务器_美国VPS_欧洲服务器 - Powered by Discuz!


好了 今天的教程到此結束。請期待明天的教程
---------------------------------------------------------------------------------------------------------------------------------------------------------
public static void main(String[] args) throws IOException {
        URL url = new URL("http://loc.516000.xyz"); //获取的地址
        Reader reader = new InputStreamReader(new BufferedInputStream(url.openStream()));
        
        int c; //tmp
        String d = "";
        while ((c = reader.read()) != -1) {
            d = d + String.valueOf((char) c);   //将Chat Copy进String
            }
        reader.close();
        System.out.println(d);
        Pattern pattern = Pattern.compile("<title>(.+?)</title>"); //正则规则
        Matcher matcher = pattern.matcher(d); //应用正则
        if(matcher.find()){
          System.out.print("Title : ");
          System.out.println(matcher.group(1)); //输出
        }

[ 本帖最后由 qiqi13245 于 2011-9-18 02:12 编辑 ]
作者: qiqi13245    时间: 2011-9-18 01:54
另外个人的ide都是把缩进用空格代替的。。
作者: chairo    时间: 2011-9-18 01:59
Mark路过
作者: chairo    时间: 2011-9-18 02:06
>>> print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0].decode("gbk","ignore").encode("utf-8","ignore")
鍏ㄧ悆涓绘満浜ゆ祦璁哄潧 缇庡浗鏈嶅姟鍣╛缇庡浗VPS_娆ф床鏈嶅姟鍣- Powered by Discuz!
>>> print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0].decode("gbk","ignore").encode("gbk","ignore")
全球主机交流论坛 美国服务器_美国VPS_欧洲服务��- Powered by Discuz!。。。。。。。。
作者: qiqi13245    时间: 2011-9-18 02:09
原帖由 chairo 于 2011-9-18 02:06 发表
>>> print re.compile(r'(.*?)',re.DOTALL).findall(hl)[0].decode("gbk","ignore").encode("utf-8","ignore")
鍏ㄧ悆涓绘満浜ゆ祦璁哄潧 缇庡浗鏈嶅姟鍣╛缇庡浗VPS_娆ф床鏈嶅姟鍣- Powered by Discuz!
>>> print ...

纳尼。
作者: cosence    时间: 2011-9-18 02:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: jasontse    时间: 2011-9-18 08:02
原帖由 qiqi13245 于 2011-9-18 02:09 发表

纳尼。

decode应该是utf8  猜的。。不会java 只会c#
作者: nyqxmfj    时间: 2011-9-18 08:11
原帖由 qiqi13245 于 2011-9-18 01:53 发表
2011·09·18 00:15更新:睡覺去了,還在論壇上的各位用力頂阿!前十位+分
順便求人品能追到CH!

本來應該發自己blog的 不過大陸那台免備硬碟掛了 先發 論壇上吧。
======================================================= ...


大家有木有感覺Java麻煩得多!!今天的教程會用更簡單的方式做更快的抓取(當然啦會先教正則表達式)
作者: nyqxmfj    时间: 2011-9-18 08:12
标题: 回复 13# chairo 的帖子
沒有打開utf-8支援吧?通過SSH調試就會這樣。
作者: 四师兄    时间: 2011-9-18 08:20
支持
作者: jasontse    时间: 2011-9-18 09:01
偷偷发一下反代 别让大C知道

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'curl_header');
curl_setopt($curl, CURLOPT_URL, 'http://主机唠嗑'.$_SERVER['REQUEST_URI']);
curl_exec($curl);
curl_close($curl);

function curl_header($curl, $head) {
        if(strncasecmp($head, 'Transfer-Encoding:', 18))
        {
                header($head);
        }
        return strlen($head);
}

[ 本帖最后由 jasontse 于 2011-9-18 09:04 编辑 ]
作者: ATOM    时间: 2011-9-18 09:18
java里有个很强大的HTML分析类库jsoup
qiqibian可以试试。
作者: nyqxmfj    时间: 2011-9-18 09:30
标题: 回复 21# ATOM 的帖子
py同樣有 beautifulsoup可以分析js
作者: Sylar    时间: 2011-9-18 09:34
python教程·一
2011·09·18 00:15更新:睡覺去了,還在論壇上的各位用力頂阿!前十位+分
順便求人品能追到CH!

本來應該發自己blog的 不過大陸那台免備硬碟掛了 先發 論壇上吧。
====================================================================
以下內容全部基於Python 2.7.2運行環境
嘛 廢話甚麼的最討厭了!直接開始:
Python是一門優雅的語言:
python程式碼的書寫相當優雅 不像傳統類C語言那樣用{}來控制程式運行。在python中 全部使用縮進符來控制 例如:
引用:

    a="mjj"
    b="ni"
    if a=="mjj":
        print b, a

1、獲取HostLoc主頁
Python有很多方便的類庫,比如支援正則表達式的re類、urllib類等等。
因為本教程內容和網路關係較大,所以我們從urllib講起。
獲取一個網頁可以很簡單的用Python做到,只需要三行程式碼。是的,你沒有看錯 三行!
import urllib
hl=urllib.urlopen("http://loc.516000.xyz")
print hl.read()
將這段代碼保存成後綴名為py指令稿,或者在python IDE中運行,看看得到了甚麼?
如果沒有輸錯的話應該看到一大攤的數據 恩 HostLoc首頁的原始碼就被輸出了
2、獲取後的信息處理
那麼 你一定有個疑問。如果我想獲取HostLoc的標題怎麼辦呢?Python有個非常方便的HTML分析類:BeautifulSoup,不過那是分析複雜的HTML網頁用的,我們不需要那麼高端的類庫,於是我們用正則自己獲取。
如何引用正則類呢?很簡單:
import re
就這一行代碼。如果我們要同時引用正則類和urllib類的話 前面說過,Python的語法很優雅,因此你不需要打入兩行import。你只需要這樣:
import re, urllib

好吧= =我承認我說了很多廢話。接下來就是重頭戲了 用正則表達式截取標題。同樣只需要幾行代碼即可實現。
import re, urllib
hl=urllib.urlopen("http://loc.516000.xyz").read()
print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0]
如果正常的話 應該會顯示出一堆奇怪的字符,比如這樣:
引用:

    ' \xe9\x8d\x8f\xe3\x84\xa7\xe6\x82\x86\xe6\xb6\x93\xe7\xbb\x98\xe6\xba\x80\xe6\xb5\x9c\xe3\x82\x86\xe7\xa5\xa6\xe7\x92\x81\xe5\x93\x84\xe6\xbd\xa7 \xe7\xbc\x87\xe5\xba\xa1\xe6\xb5\x97\xe9\x8f\x88\xe5\xb6\x85\xe5\xa7\x9f\xe9\x8d\xa3\xe2\x95\x9b\xe7\xbc\x87\xe5\xba\xa1\xe6\xb5\x97VPS_\xe5\xa8\x86\xd1\x84\xe5\xba\x8a\xe9\x8f\x88\xe5\xb6\x85\xe5\xa7\x9f\xe9\x8d\xa3- Powered by Discuz!'

要怎麼讓它變成中文呢?很簡單,把
引用:

    print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0]

改成
引用:

    print re.compile(r'<title>(.*?)</title>',re.DOTALL).findall(hl)[0].decode("gbk","ignore").encode("utf-8","ignore")

* 請注意 如果你通過ssh調試,並且沒有打開本地的utf-8支援或者漢字支援的話,看到的將是亂碼。如果你在本地用python調試就不會。
運行後將會輸出:
引用:

    全球主机交流论坛 美国服务器_美国VPS_欧洲服务器 - Powered by Discuz!

好了 今天的教程到此結束。請期待明天的教程
作者: Kokgog    时间: 2011-9-18 09:37
原帖由 nyqxmfj 于 2011-9-18 09:30 发表
py同樣有 beautifulsoup可以分析js




作者: qiqi13245    时间: 2011-9-18 12:31
原帖由 nyqxmfj 于 2011-9-18 08:11 发表


大家有木有感覺Java麻煩得多!!今天的教程會用更簡單的方式做更快的抓取(當然啦會先教正則表達式)

没感觉,java是对象。。。凡是都要new出来 所以看起来麻烦点 自带的库在JDK7中更新了 可直接get
作者: 见钱开眼    时间: 2011-9-18 13:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: Kokgog    时间: 2011-9-18 13:45
标题: 回复 25# qiqi13245 的帖子
java是万物皆class,python是万物皆object.......其实控java的可以玩下scala,完成楼主这个功能行数和python差不多........
作者: qiqi13245    时间: 2011-9-18 14:01
原帖由 Kokgog 于 2011-9-18 13:45 发表
java是万物皆class,python是万物皆object.......其实控java的可以玩下scala,完成楼主这个功能行数和python差不多........

-0- java是面向对象的语言哦。除非是static方法 否则都是要object完成




欢迎光临 全球主机交流论坛 (https://loc.516000.xyz/) Powered by Discuz! X3.4