本文目錄一覽:
- 1、如何入門 Python 爬蟲
- 2、python 函數如何封裝?
- 3、如何入門 Python 爬蟲?
- 4、python如何封裝函數
- 5、如何用Python封裝C語言的字符串處理函數
- 6、怎麼把下面的Python代碼封裝成函數
如何入門 Python 爬蟲
個人覺得:
新手學習python爬取網頁先用下面4個庫就夠了:(第4個是實在搞不定用的,當然某些特殊情況它也可能搞不定)
1. 打開網頁,下載文件:urllib
2. 解析網頁:BeautifulSoup,熟悉JQuery的可以用Pyquery
3. 使用Requests來提交各種類型的請求,支持重定向,cookies等。
4. 使用Selenium,模擬瀏覽器提交類似用戶的操作,處理js動態產生的網頁
這幾個庫有它們各自的功能。配合起來就可以完成爬取各種網頁並分析的功能。具體的用法可以查他們的官網手冊(上面有鏈接)。
做事情是要有驅動的,如果你沒什麼特別想抓取的,新手學習可以從這個闖關網站開始
,目前更新到第五關,闖過前四關,你應該就掌握了這些庫的基本操作。
實在闖不過去,再到這裡看題解吧,第四關會用到並行編程。(串行編程完成第四關會很費時間哦),第四,五關只出了題,還沒發佈題解。。。
學完這些基礎,再去學習scrapy這個強大的爬蟲框架會更順些。這裡有它的中文介紹。
這是我在知乎的回答,直接轉過來有些鏈接沒有生效,可以到這裡看原版,
python 函數如何封裝?
不是不可以,只是這樣做沒有意義,另外變量作用域的問題,會使得操作變得很複雜
如何入門 Python 爬蟲?
「入門」是良好的動機,但是可能作用緩慢。如果你手裡或者腦子裡有一個項目,那麼實踐起來你會被目標驅動,而不會像學習模塊一樣慢慢學習。
如果你想要入門Python爬蟲,你需要做很多準備。首先是熟悉python編程;其次是了解HTML;
還要了解網絡爬蟲的基本原理;最後是學習使用python爬蟲庫。
如果你不懂python,那麼需要先學習python這門非常easy的語言。編程語言基礎語法無非是數據類型、數據結構、運算符、邏輯結構、函數、文件IO、錯誤處理這些,學起來會顯枯燥但並不難。
剛開始入門爬蟲,你甚至不需要去學習python的類、多線程、模塊之類的略難內容。找一個面向初學者的教材或者網絡教程,花個十幾天功夫,就能對python基礎有個三四分的認識了。
網絡爬蟲的含義:
網絡爬蟲,其實也可以叫做網絡數據採集更容易理解。就是通過編程向網絡服務器請求數據(HTML表單),然後解析HTML,提取出自己想要的數據。
這會涉及到數據庫、網絡服務器、HTTP協議、HTML、數據科學、網絡安全、圖像處理等非常多的內容。但對於初學者而言,並不需要掌握這麼多。
python如何封裝函數
可以定義一個類,類里定義很多函數(主要用它做什麼)或直接定義函數在一個py文件中
在另一個文件中導入這個那個py包,調用類和方法
就是封裝了
如何用Python封裝C語言的字符串處理函數
在C語言中,字符串處理是每天都要面對的問題。我們都知道C語言中其實並沒有一種原生的字符串類型,『字符串』在C語言里只是一種特殊的以”結尾的字符數組。因此,如何將C語言與更高層次的Python語言在『字符串』處理這個問題上對接是一個有難度的問題。所幸有swig這種強大的工具。
如何封裝一個函數,它修改參數字符串的內容
假如有這樣一個C語言的函數,
!– lang: cpp —
void FillZero(char* pc,size_t * piLen)
{
size_t i=0;
while(i++*piLen/2 )
*pc++ = ‘0’;
*pc = 0;
*piLen = i+1;
}
這個函數的功能是把字符串變成n個0。不過我們更關注函數的形式。這樣的函數,表面上看char* pc是函數的參數,可是實際上它才是函數的返回值和執行的結果。piLen這個參數既是pc的最大長度,也是新的字符串的長度。我們直接用python封裝,看看運行結果。
Type “help”, “copyright”, “credits” or “license” for more information.
import cchar
s=’123456′
cchar.FillZero(s,6)
Traceback (most recent call last):
File “stdin”, line 1, in module
TypeError: in method ‘FillZero’, argument 2 of type ‘size_t *’
結果差強人意,不是我們想要得到的結果。函數的第二個參數為size_t* 我們很難用python來表示,而且python中也不存在既是輸入,也是輸出的參數。
swig有一個標準庫,其中有一個cstring.i文件就是用來解決C語言字符串類型的問題。
我們在.i文件中加入這樣幾行
!– lang: cpp —
%include “cstring.i”
%cstring_output_withsize(char* pc,size_t* pi)
void FillZero(char* pc, size_t* pi);
然後運行看結果
Type “help”, “copyright”, “credits” or “license” for more information.
import cchar
cchar.FillZero(10)
‘00000\x00’
s=cchar.FillZero(10)
print s
00000
我們看函數的變化。首先在python里, FillZero變成了只有一個參數的函數。然後函數的返回值變成了一個字符串。其實cstring_output_size其實是一個宏,通過這個宏的定義改變了函數的形式,直接在Python中得到我們想要的結果。
其實類似cstring_output_size的宏還有好幾個,我列舉一下:
cstring_output_allocate(char *s,free($1));
第一個參數是指向字符串地址的指針,第二個參數為釋放空間的方法。
大家考慮這一下這樣的函數:
void foo(char* s)
{
s = (char*)malloc(10);
memcpy(s,”123456789″,9);
}
s這個參數表面上看是輸入,實際上是函數真正的輸出。 函數中真正改變的東西是chars指向的字符串的值。而且char這個類型,
python或者其他腳本語言里應該都沒有對應的類型。那麼我們用cstring_output_allocate將這個函數轉換成另外一個形式的python或者其他腳本語言的函數。轉換後的函數其實是這樣的,以python為例str
foo()。
!– lang: cpp —
%module a
%include “cstring.i”
%{
void foo(char* s);
%}
%cstring_output_allocate(char *s, free(*$1));
void foo(char *s);
在python中的調用:
!– lang: python —
import a
a.foo()
‘123456789’
cstring_output_maxsize(char *path, int maxpath);
第一個參數也是可以改變的字符串首地址,第二個參數為字符串的最大長度。在Python中調用的時候,只有maxpath這個參數,返回字符串。
cstring_output_allocate(char *s, free($1));
第一個參數為指向字符串首地址的指針,第二個參數為釋放指針的方法。這個宏主要是封裝一種直接在函數內部malloc空間的函數。在Python中調用時沒有參數,直接返回字符串。
cstring_output_allocate_size(char *s, int slen, free(*$1));
這個相當於前面兩個函數的組合。在函數內部malloc空間,然後將字符串長度通過slen返回。其實在調用的時候非常簡單,沒有參數,直接返回字符串。
如何處理c++的std::string
std::string是C++標準類庫STL中常見的類。在平時工作中大家肯定是沒少用。在python中如何封裝std::string? swig提供了標準庫
例如函數:
!– lang: cpp —
string Repeat(const string s)
{
return s+s;
}
只要在swig中加入這樣幾行:
!– lang: cpp —
%include “std_string.i”
using namespace std;
string Repeat(const string s);
運行結果:
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
import cchar
cchar.Repeat(‘123’)
‘123123’
使用起來很方便,但需要注意的是,假如函數的參數的內容是可以被修改,就不能用這種方式封裝。
例如:
!– lang: cpp —
void repeat(string s)
{
s+=s;
}
這樣的函數直接使用 ‘std_string.i’ 就是無效的。遇到這種函數,只能用C語言封裝成 void repeat(chars, int maxsize), 再用swig調用 ‘cstring_output_withsize’ 這個宏再封裝一次了。
怎麼把下面的Python代碼封裝成函數
Python:常用函數封裝:
def is_chinese(uchar):
“””判斷一個unicode是否是漢字”””
if uchar = u’\u4e00′ and uchar=u’\u9fa5′:
return True
else:
return False
def is_number(uchar):
“””判斷一個unicode是否是數字”””
if uchar = u’\u0030′ and uchar=u’\u0039′:
return True
else:
return False
def is_alphabet(uchar):
“””判斷一個unicode是否是英文字母”””
if (uchar = u’\u0041′ and uchar=u’\u005a’) or (uchar = u’\u0061′ and uchar=u’\u007a’):
return True
else:
return False
def is_other(uchar):
“””判斷是否非漢字,數字和英文字符”””
if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
return True
else:
return False
def B2Q(uchar):
“””半角轉全角”””
inside_code=ord(uchar)
if inside_code0x0020 or inside_code0x7e: #不是半角字符就返回原來的字符
return uchar
if inside_code==0x0020: #除了空格其他的全角半角的公式為:半角=全角-0xfee0
inside_code=0x3000
else:
inside_code+=0xfee0
return unichr(inside_code)
def Q2B(uchar):
“””全角轉半角”””
inside_code=ord(uchar)
if inside_code==0x3000:
inside_code=0x0020
else:
inside_code-=0xfee0
if inside_code0x0020 or inside_code0x7e: #轉完之後不是半角字符返回原來的字符
return uchar
return unichr(inside_code)
def stringQ2B(ustring):
“””把字符串全角轉半角”””
return “”.join([Q2B(uchar) for uchar in ustring])
def uniform(ustring):
“””格式化字符串,完成全角轉半角,大寫轉小寫的工作”””
return stringQ2B(ustring).lower()
def string2List(ustring):
“””將ustring按照中文,字母,數字分開”””
retList=[]
utmp=[]
for uchar in ustring:
if is_other(uchar):
if len(utmp)==0:
continue
else:
retList.append(“”.join(utmp))
utmp=[]
else:
utmp.append(uchar)
if len(utmp)!=0:
retList.append(“”.join(utmp))
return retList
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/258594.html