求python小型爬虫

48 views
Skip to first unread message

python

unread,
Mar 2, 2009, 8:56:17 AM3/2/09
to python-cn`CPyUG`华蟒用户组
只要爬虫就行,小型的。具体要求如下:
http://www.readnovel.com中的所有小说名称和链接地址。
如小说名称:幻梦千年;小说链接:http://www.readnovel.com/novel/56324.html;最近更新章节:第二十九节
http://www.readnovel.com/partlist/56324/)只要这三项就可以。
最好是多线程的,采集时间不要太长。

于海

unread,
Mar 2, 2009, 9:02:38 AM3/2/09
to pyth...@googlegroups.com
这个很容易实现的

2009/3/2 python <malin...@gmail.com>

python

unread,
Mar 2, 2009, 9:21:59 AM3/2/09
to python-cn`CPyUG`华蟒用户组
那就写出来或者说出来啊。谢谢昂!

@@

unread,
Mar 2, 2009, 9:24:43 AM3/2/09
to pyth...@googlegroups.com
你是想付费请人开发吗

2009/3/2 python <malin...@gmail.com>
那就写出来或者说出来啊。谢谢昂!

Victor Lin

unread,
Mar 2, 2009, 9:49:45 AM3/2/09
to python-cn`CPyUG`华蟒用户组
可以參考我寫的

http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab-web/

以我抓網頁的經驗來講,Twisted + lxml是我目前用過最好用的工具組合
我有寫一個函式庫是架構在那之上的
http://webchuan.ez2learn.com/

它的設計是用piple line的概念,可以同時開很多管線來抓網頁,速度會很快
http://webchuan.ez2learn.com/wiki/DesignOfWebChuan

這有幾個例子
http://webchuan.ez2learn.com/wiki/Examples/GetPageTitle
http://webchuan.ez2learn.com/wiki/Examples/DownloadPhotos

不過如果是很少的資料,直接用twisted + lxml開發起來反而輕鬆
因為twisted的deferred機制已經很棒了,而且反正資料也一下子就抓完了,沒必要寫多好

我的webchuan因為後來也沒有遇到需要抓比較大網站,所以我自己也沒有在用,可能會有一些bug
有興趣可以參考看看,程式寫沒有很好,不過我想設計的概念應該是對的
甚至我想說可以做出GUI界面,讓抓網頁拉一拉元素接在一起構成pipeline就可以跑

以上

Victor Lin.

@@

unread,
Mar 2, 2009, 10:01:45 AM3/2/09
to pyth...@googlegroups.com


2009/3/2 Victor Lin <Born...@gmail.com>

可以參考我寫的

http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab-web/

以我抓網頁的經驗來講,Twisted + lxml是我目前用過最好用的工具組合
我有寫一個函式庫是架構在那之上的
http://webchuan.ez2learn.com/

它的設計是用piple line的概念,可以同時開很多管線來抓網頁,速度會很快
http://webchuan.ez2learn.com/wiki/DesignOfWebChuan

這有幾個例子
http://webchuan.ez2learn.com/wiki/Examples/GetPageTitle
http://webchuan.ez2learn.com/wiki/Examples/DownloadPhotos

不過如果是很少的資料,直接用twisted + lxml開發起來反而輕鬆
因為twisted的deferred機制已經很棒了,而且反正資料也一下子就抓完了,沒必要寫多好 
 
lxml看起来不错,下次试试 

LaiYonghao

unread,
Mar 2, 2009, 10:20:31 AM3/2/09
to pyth...@googlegroups.com
谢谢分享,写得挺好,比你正儿八经写的教程要好,大概是因为我喜欢这种毫不造作的自然语调吧。
 
我也写过爬虫,用的是 urllib2 和 beautifulsoup,用来抓取我的喜欢的网络图片,其实抓取内容是不是自己想要的,可以通过自己写个函数过去注册一下就行了。因为我自己的应用不太健康,所以就不分享啦。哈哈。


 
2009/3/2 Victor Lin <Born...@gmail.com>

ffox

unread,
Mar 2, 2009, 7:25:13 PM3/2/09
to pyth...@googlegroups.com
h的?嘿嘿

2009/3/2 LaiYonghao <lanp...@gmail.com>

刘鑫

unread,
Mar 2, 2009, 7:49:39 PM3/2/09
to pyth...@googlegroups.com
wget试过没?

2009/3/2 LaiYonghao <lanp...@gmail.com>



--
杀人放火金腰带,补路修桥无尸骸。

……

劉鑫
March.Liu

小将

unread,
Mar 2, 2009, 8:56:21 PM3/2/09
to python-cn`CPyUG`华蟒用户组
其实我个人认为,主要的地方会是在*抓*这个过程,而不是*信息抽取*的过程。
主要是多线程,还有一些智能化。比如说只给出首页,spider就会抓到内部所有的链接,再抓到内容。
抓到内容之后,信息抽取用正取表达式,来的会比其它的更快一些。写起来也方便一些。

On 3月2日, 下午10时49分, Victor Lin <Borns...@gmail.com> wrote:
> 可以參考我寫的
>
> http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab...
>
> 以我抓網頁的經驗來講,Twisted + lxml是我目前用過最好用的工具組合
> 我有寫一個函式庫是架構在那之上的http://webchuan.ez2learn.com/
>
> 它的設計是用piple line的概念,可以同時開很多管線來抓網頁,速度會很快http://webchuan.ez2learn.com/wiki/DesignOfWebChuan
>
> 這有幾個例子http://webchuan.ez2learn.com/wiki/Examples/GetPageTitlehttp://webchuan.ez2learn.com/wiki/Examples/DownloadPhotos

Heroboy

unread,
Mar 2, 2009, 8:59:19 PM3/2/09
to pyth...@googlegroups.com
我觉得Twisted + lxml太复杂太庞大了吧。
我的经验是用python读取某些目录的页面,生成下载地址,让专业的下载工具去下载。那样就不用python去关心类似断线续传诸如此类的问题了。

2009/3/2 Victor Lin <Born...@gmail.com>

Li Feng

unread,
Mar 2, 2009, 9:16:44 PM3/2/09
to pyth...@googlegroups.com
我感觉还是像BeautifulSoup之类的对html, xml进行解析的工具比较方便。
正则表达式表达的意思比较隐讳,没有比较清晰的语意。虽然可能会快些。

Li Feng
blog: http://okidogi.yo2.cn


2009/3/3 小将 <with...@gmail.com>

Victor Lin

unread,
Mar 2, 2009, 10:06:37 PM3/2/09
to python-cn`CPyUG`华蟒用户组
Twisted雖然龐大,但有它的好處在,可以參考
http://ez2learn.com/index.php/python-tutorials/twisted-tutorials/190-deferred--retry
這是我個人寫的retry例子,利用deferred的特性,使用者可以很輕易地讓各種非同步的操作有自動retry的功能,至於續傳,只要花點心力我
想也是不難
Twisted的強項在非同步的處理,而且事件的處理都是在main thread,所以通常都不用考慮multi-thread的一些常見問題
而且遇到吃CPU很重的工作,可以deferred到thread pool裡去做,Twisted也有它的thread pool,所以也不用自己寫
一個
像這樣

d = deferredToThread(parseBigComplexHtml, html)

它就會被丟到thread pool完成了再回傳過來
雖然複雜,但有它的好處在

On 3月3日, 上午9時59分, Heroboy <yangwei...@gmail.com> wrote:
> 我觉得Twisted + lxml太复杂太庞大了吧。
> 我的经验是用python读取某些目录的页面,生成下载地址,让专业的下载工具去下载。那样就不用python去关心类似断线续传诸如此类的问题了。
>

> 2009/3/2 Victor Lin <Borns...@gmail.com>
>
> > 可以參考我寫的
>
> >http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab...

Victor Lin

unread,
Mar 2, 2009, 10:19:51 PM3/2/09
to python-cn`CPyUG`华蟒用户组
對於有明確目標的網頁而言,例如

<div id="foo">blah...</div>

這樣來說,正規表示法就可以做得很好,但是就如果是要靠上下文才能找到目標的內容,例如

<h1 id="title">...</h1>
<div>...</div>

正規表示法就可頭大了,可能要先找到附近可以辯識的目標,然後再想辦法找到相對的關系,但是lxml用xpath就不會有這問題,不管是子孫、兄弟節
點,都可以用語法來表達並且找到

BeautifulSoup雖然也不錯,但是它的find之類函數實在是太沒效率了,我之前開發過一個抓amazon商品資料的程式,就是用
beautifulsoup,我發現CPU使用率都是佔滿的,不像我預期的那樣,都在等網路IO,而是都在等CPU,我使用profile下去跑,發現
八九成的時間都落在soup的find上面,他的find實在是很暴力,為了效能考量,我後來就改用lxml,不只效能上改進太多了,而且我發現用
xpath來抓標籤,比用一個一個find再用判斷之類的來得容易和輕楚,給個例子,我有抓過台灣的股價報表網頁,有用beautifulsoup寫過
的版本,和lxml寫過的版本,可以比較看看

# beautiful soup
def parsePrice(html):
"""after 95/12/31

"""
soup = BeautifulSoup(html.decode('cp950', 'ignore'))
# <table id='contentTable' cellpadding='0' cellspacing='1'
border='0' style='width:100%;'>
table = soup.find('table', {'id': 'contentTable', 'cellpadding':
'0', 'cellspacing': '1', 'border': '0', 'style': 'width:100%;'})
if table:
trList = table.findAll('tr')
priceList = []
for tr in trList:
tdList = tr.findAll('td')
#print fontList
valueList = []
for td in tdList:
content = unicode(td.contents[0]) if td.contents else
''
content = content.replace(u',', '').replace(u'⊙',
'').replace(u'⊕', '').strip()
valueList.append(content)

#print len(valueList), valueList
if len(valueList) == 17:
id = str(valueList[0])
name = valueList[1]
close = float(valueList[2])
open = float(valueList[4])
high = float(valueList[5])
low = float(valueList[6])
volume = int(valueList[8].replace(',', ''))
stockPrice = {'id': id,
'name': name,
'volume': volume,
'open': open,
'close': close,
'high': high,
'low': low
}
if not stockPrice['id'].startswith('0') and len
(stockPrice['id']) == 4:
try:
stockPrice['id'] = int(stockPrice['id'])
priceList.append(stockPrice)
#print stockPrice
except ValueError:
pass
return priceList
return None

# lxml
def parsePriceFaster(html):
"""after 95/12/31, faster version, using lxml

"""
parser = etree.HTMLParser()
tree = etree.parse(StringIO.StringIO(html.decode('cp950',
'ignore')), parser)
trList = tree.xpath("/descendant::table[@id='contentTable']//tr")
if trList:
def getPriceMap(tr):
tdList = tr.xpath("td")
#print etree.tostring(tr, pretty_print=True)
if len(tdList) != 17:
return None

id = strip(tdList[0])
name = unicode(strip(tdList[1]).replace(' ', ''))
close = float(strip(tdList[2]))
open = float(strip(tdList[4]))
high = float(strip(tdList[5]))
low = float(strip(tdList[6]))
volume = int(strip(tdList[8]))

if not id.startswith('0') and len(id) == 4:
try:
id = int(id)
except ValueError:
return None
else:
return None

stockPrice = {
'id': id,
'name': name,
'volume': volume,
'open': open,
'close': close,
'high': high,
'low': low
}
#print stockPrice
return stockPrice
resultList = [getPriceMap(tr) for tr in trList]
return filter(lambda x: x, resultList)
return None

同樣是找tr,xpath一句話就解決了

On 3月3日, 上午10時16分, Li Feng <nemoking...@gmail.com> wrote:
> 我感觉还是像BeautifulSoup之类的对html, xml进行解析的工具比较方便。
> 正则表达式表达的意思比较隐讳,没有比较清晰的语意。虽然可能会快些。
>
> Li Feng
> blog:http://okidogi.yo2.cn
>

> 2009/3/3 小将 <withw...@gmail.com>


>
> > 其实我个人认为,主要的地方会是在*抓*这个过程,而不是*信息抽取*的过程。
> > 主要是多线程,还有一些智能化。比如说只给出首页,spider就会抓到内部所有的链接,再抓到内容。
> > 抓到内容之后,信息抽取用正取表达式,来的会比其它的更快一些。写起来也方便一些。
>
> > On 3月2日, 下午10时49分, Victor Lin <Borns...@gmail.com> wrote:
> > > 可以參考我寫的
>
> > >http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab...
>
> > > 以我抓網頁的經驗來講,Twisted + lxml是我目前用過最好用的工具組合
> > > 我有寫一個函式庫是架構在那之上的http://webchuan.ez2learn.com/
>

> > > 它的設計是用piple line的概念,可以同時開很多管線來抓網頁,速度會很快
> >http://webchuan.ez2learn.com/wiki/DesignOfWebChuan
>
> > > 這有幾個例子

> >http://webchuan.ez2learn.com/wiki/Examples/GetPageTitlehttp://webchua...

Heroboy

unread,
Mar 2, 2009, 10:40:48 PM3/2/09
to pyth...@googlegroups.com
你要是想写个框架写个强大且通用的东西的话,当然可以竭尽所能用最好的最有效率的。不过已经有现成的 http://linux.duke.edu/projects/urlgrabber/ 了。
在网上看到一篇小说,或者套图之类的,临时写个程序,难道还要很麻烦的安装2个二进制包的Twisted+lxml?内置的正则表达式甚至是string.find,或者是只有一个py文件的BeautifulSoup才是最方便的。
要是没有python的话,用javascript都可以写一个,顺便还可以使用浏览器强大的dom,http://userscripts.org/scripts/show/37453
我觉得这种程序最重要的就是,当Ctrl+break或者关机了,第二天能接着下载。这也是我推荐用python来生成下载列表,而让其它下载软件来下载的原因。否则,python写起来不但十分的麻烦,而且不那么绿色。

2009/3/3 Victor Lin <Born...@gmail.com>

python

unread,
Mar 3, 2009, 12:13:15 AM3/3/09
to python-cn`CPyUG`华蟒用户组
汗,说的越来越深奥。我不是要下载他的小说。我只要他的链接地址,名称,和最新章节的名称和链接。其他的都不要。我不下载小说内容。只想做一个包含上面
东西的一个数据库即可!
OK?

On 3月3日, 上午11时40分, Heroboy <yangwei...@gmail.com> wrote:
> 你要是想写个框架写个强大且通用的东西的话,当然可以竭尽所能用最好的最有效率的。不过已经有现成的http://linux.duke.edu/projects/urlgrabber/了。
> 在网上看到一篇小说,或者套图之类的,临时写个程序,难道还要很麻烦的安装2个二进制包的Twisted+lxml?内置的正则表达式甚至是string.fi-nd,或者是只有一个py文件的BeautifulSoup才是最方便的。


> 要是没有python的话,用javascript都可以写一个,顺便还可以使用浏览器强大的dom,http://userscripts.org/scripts/show/37453

> 我觉得这种程序最重要的就是,当Ctrl+break或者关机了,第二天能接着下载。这也是我推荐用python来生成下载列表,而让其它下载软件来下载的原因-。否则,python写起来不但十分的麻烦,而且不那么绿色。
>
> 2009/3/3 Victor Lin <Borns...@gmail.com>

> > > > > > 最好是多线程的,采集时间不要太长。- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Heroboy

unread,
Mar 3, 2009, 12:17:09 AM3/3/09
to pyth...@googlegroups.com
OK

2009/3/3 python <malin...@gmail.com>

yobin

unread,
Mar 3, 2009, 12:18:15 AM3/3/09
to pyth...@googlegroups.com
自己学一下嘛,没有人会免费帮你专门写一个针对你的这个需求的程序吧

当初我也是为了爬网上的东西才学python的,花了不到半天时间就学会初步的python爬资料了,很快的。

Li Xunhao

unread,
Mar 3, 2009, 12:47:22 AM3/3/09
to pyth...@googlegroups.com
做过一个类似的crawler,用到了BeautifulSoup来分析HTML,然后用ClientForm来填表,相当简单。

如果只要link和name的话,BeautifulSoup就足够啦。

2009/3/2 python <malin...@gmail.com>:

--
Xunhao Li
A USTC Alumnus

Sent from: Edmonton Ab Canada.

Jiahua Huang

unread,
Mar 3, 2009, 12:52:16 AM3/3/09
to pyth...@googlegroups.com
2009/3/3 刘鑫 <marc...@gmail.com>:
> wget试过没?
>

顶 wget,
如果不是像上次某人那样坚持不要别人的任何模块自己写纯 python,
简单用个 wget 命令行就足够了(XP 可以装 msys)

Leo Jay

unread,
Mar 3, 2009, 12:55:35 AM3/3/09
to pyth...@googlegroups.com
2009/3/2 Jiahua Huang <jhuang...@gmail.com>:

wget编译出来就是native的,不需要其它库的。

--
Best Regards,
Leo Jay

Jiahua Huang

unread,
Mar 3, 2009, 1:03:04 AM3/3/09
to pyth...@googlegroups.com
2009/3/3 Leo Jay <python...@gmail.com>:
> wget编译出来就是native的,不需要其它库的。
>

是说 msys 省事点,不会再要啥了还临时装,
而且 bash 比 cmd 省事点。

testisok

unread,
Mar 3, 2009, 2:20:55 AM3/3/09
to python-cn`CPyUG`华蟒用户组
我写了个应用,可以将整个含有图片的树形目录整个存储/恢复,隐藏地点mysql,可以合作一下,握个抓

On 3月2日, 下午11时20分, LaiYonghao <lanpha...@gmail.com> wrote:
> 谢谢分享,写得挺好,比你正儿八经写的教程要好,大概是因为我喜欢这种毫不造作的自然语调吧。
>
> 我也写过爬虫,用的是 urllib2 和

> beautifulsoup,用来抓取我的喜欢的网络图片,其实抓取内容是不是自己想要的,可以通过自己写个函数过去注册一下就行了。因为我自己的应用不太健康-,所以就不分享啦。哈哈。
>
> 2009/3/2 Victor Lin <Borns...@gmail.com>
>
>
>
>
>
> > 可以參考我寫的
>
> >http://blog.ez2learn.com/2008/10/05/python-is-the-best-choice-to-grab...


>
> > 以我抓網頁的經驗來講,Twisted + lxml是我目前用過最好用的工具組合
> > 我有寫一個函式庫是架構在那之上的
> >http://webchuan.ez2learn.com/
>
> > 它的設計是用piple line的概念,可以同時開很多管線來抓網頁,速度會很快
> >http://webchuan.ez2learn.com/wiki/DesignOfWebChuan
>
> > 這有幾個例子
> >http://webchuan.ez2learn.com/wiki/Examples/GetPageTitle
> >http://webchuan.ez2learn.com/wiki/Examples/DownloadPhotos
>
> > 不過如果是很少的資料,直接用twisted + lxml開發起來反而輕鬆
> > 因為twisted的deferred機制已經很棒了,而且反正資料也一下子就抓完了,沒必要寫多好
>
> > 我的webchuan因為後來也沒有遇到需要抓比較大網站,所以我自己也沒有在用,可能會有一些bug
> > 有興趣可以參考看看,程式寫沒有很好,不過我想設計的概念應該是對的
> > 甚至我想說可以做出GUI界面,讓抓網頁拉一拉元素接在一起構成pipeline就可以跑
>
> > 以上
>
> > Victor Lin.
>
> > On 3月2日, 下午9時56分, python <malinqi...@gmail.com> wrote:
> > > 只要爬虫就行,小型的。具体要求如下:
> > > 爬http://www.readnovel.com中的所有小说名称和链接地址。
> > > 如小说名称:幻梦千年;小说链接:http://www.readnovel.com/novel/56324.html;最近更新章节:第二十九节
> > > (http://www.readnovel.com/partlist/56324/)只要这三项就可以。
> > > 最好是多线程的,采集时间不要太长。
>

> --
> 赖勇浩的编程私伙局:http://blog.csdn.net/lanphaday- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Victor Lin

unread,
Mar 3, 2009, 5:18:59 AM3/3/09
to python-cn`CPyUG`华蟒用户组
不好意思這部份你可能有些誤解我的意思,我指的解決方案是較複雜的網頁抓取才會真的非得用比較"龐大"的解決方法,簡單的網頁抓取躺著寫、趴著寫、跳著
寫都可以寫得出來,反正抓完就結束了,所以隨便寫也無所謂,一點點資料抓沒兩下就完了,再怎麼沒效率,也比不上開發所要花的時間,而且電腦在跑時還能做
其它事情,不過當抓取資料的時間需要用到一兩天、兩三天的時間,而且可能還需要持續更新時,就不是這麼回事了,我指的解決方法是針對大量且較複雜的網頁
抓取,還要把資料分析然後丟到資料庫裡面的應用,我不是指所有雞都要用牛刀殺,只是提供有這樣的解法

但是如果不考慮Twisted + lxml需要另外安裝的問題的話,但是用twisted + lxml就算抓簡單的網頁、圖片之類的也是非常輕鬆的
事情,例如圖片好了,用xpath只要這樣寫

imgs = tree.xpath("//img")
for img in imgs:
pass

就一口氣抓完所有圖片,雖然regular也辦得到,但是還得想一下語法,查一下regular語法,如果我們能夠輕鬆地使用牛刀殺雞,為什麼要花更多
時間? 當然牛刀要部署得付出代價,省下來的是寶貴的開發時間,而且我不認為easy_install或是next next...的twisted和
lxml安裝過程會比開發時間還來得長和寶貴,再者用完就丟的程式也不需要管綠不綠色,我不明白綠不綠色對於用完即丟的程式有何重要性可言,為了證明我
所說的,我示範一下如何用牛刀殺雞,下面程式示範如何抓到一個網頁裡的所有圖片,用的正是我所提到的twisted + lxml

import cStringIO

from twisted.internet import reactor
from twisted.web.client import getPage
from twisted.python.util import println
from lxml import etree

def parseHtml(html):
parser = etree.HTMLParser()
tree = etree.parse(cStringIO.StringIO(html), parser)
imgs = tree.xpath("//img")
for img in imgs:
print img.get('src')
reactor.stop()

d = getPage('http://www.google.com.tw')
d.addCallbacks(parseHtml)
d.addErrback(println)
reactor.run()

雖說twisted + lxml是牛刀,但是對於小應用來說會使的話一點都不費力,以上程式用了一兩分鐘就寫好了,xpath 對於像這樣簡單的應用
來說,還是簡單到不行,只要你大概懂xpath,上面的應用連語法都不用查,用regular expression還得查語法,而且還有greedy
的問題,可能忘記加?在後面發現奇怪,怎麼網頁全部抓進來了,才發現忘了加?而beautifulsoup只有簡單的find函數,稍唯再複雜個一點點
就需要額外的羅輯來找tag,當然我不是說beautifulsoup或regular expression不好,只是目的在解決問題,所以對於細節
一點都不在意,twisted綠色與否、lxml綠色與否,一點都不重要,重點在於開發的效率

這只是最簡單的例子,如果你想要某個標籤內的img就好呢? xpath還是一樣輕鬆,只要把上面那行xpath改成

imgs = tree.xpath("//div[@id='foo']//imgs")

那regular expression或是find之類的呢? ... regular expression變得更複雜,你可能要拆成兩段,先找
div抓裡面的字再找imgs

好吧,那再複雜一點呢? 假如如果你只能靠辮識div,再找它的parent,然後再找它的第幾個兄弟來抓到tag怎麼辦? regular
expression會寫眼睛花了,beautiful soup有點小麻煩,但lxml + xpath還是一樣優雅

這裡所說的複雜還算在簡單的範圍內,既然有更優雅的方式,我個人是寧可選擇優雅地揮兩下牛刀就把雞殺了,而不想花任何寶貴的開發時間在無所謂的綠色與否
上,再者twisted + lxml也可以用py2exe打包,這點我有做過,到最後只剩一個資料夾裡面執行檔和一堆libraries,根本沒有安
裝的問題

我想說的是,twisted + lxml是我目前覺得最好用的抓網頁工具組合,並不代表說所有網頁非得用它們來抓不可,但是用它來抓有像我說的這些好
處,如果你不在意安裝那種小問題的話,twisted + lxml絕對是非常好的選擇,當然如果有更好的解決方法我也想知道,或許是我太淺,還有更好
的方法我不知道,或許可以貼上來同樣目的的程式不同的方案解決寫出來會是什麼樣子,可以跟大家分享一下

On 3月3日, 上午11時40分, Heroboy <yangwei...@gmail.com> wrote:
> 你要是想写个框架写个强大且通用的东西的话,当然可以竭尽所能用最好的最有效率的。不过已经有现成的http://linux.duke.edu/projects/urlgrabber/了。

> 在网上看到一篇小说,或者套图之类的,临时写个程序,难道还要很麻烦的安装2个二进制包的Twisted+lxml?内置的正则表达式甚至是string.find,或者是只有一个py文件的BeautifulSoup才是最方便的。
> 要是没有python的话,用javascript都可以写一个,顺便还可以使用浏览器强大的dom,http://userscripts.org/scripts/show/37453
> 我觉得这种程序最重要的就是,当Ctrl+break或者关机了,第二天能接着下载。这也是我推荐用python来生成下载列表,而让其它下载软件来下载的原因。否则,python写起来不但十分的麻烦,而且不那么绿色。
>

> 2009/3/3 Victor Lin <Borns...@gmail.com>

Victor Lin

unread,
Mar 3, 2009, 5:40:21 AM3/3/09
to python-cn`CPyUG`华蟒用户组
稍唯改寫了一下程式,讓它可以直接把圖片載下來

import urlparse
import cStringIO

from twisted.internet import reactor
from twisted.web.client import getPage
from twisted.python.util import println
from lxml import etree

imgCount = 0

def saveImg(data, name):
global imgCount
print 'Save', name
open(name, 'wb').write(data)
imgCount -= 1
if not imgCount:
reactor.stop()

def parseHtml(html, base):
global imgCount


parser = etree.HTMLParser()
tree = etree.parse(cStringIO.StringIO(html), parser)
imgs = tree.xpath("//img")

imgCount += len(imgs)
for img in imgs:
url = urlparse.urljoin(base, img.get('src'))
name = url.split('/')[-1]
print url
d = getPage(url)
d.addCallback(saveImg, name=name)

url = 'http://www.google.com.tw'
d = getPage(url)
d.addCallback(parseHtml, base=url)
d.addErrback(println)
reactor.run()

> ...
>
> 閱讀更多 >>

Joe

unread,
Mar 3, 2009, 5:42:30 AM3/3/09
to pyth...@googlegroups.com
Victor Lin 可真是個好人。


贊一個!

2009/3/3 Victor Lin <Born...@gmail.com>

DianQ

unread,
Mar 3, 2009, 9:28:00 AM3/3/09
to python-cn
我前段时间也一直用python来进行抓取,不过和大家讨论的不太一样 把可以拿出的拿出来与大家分享一下
 
我们使用php搭建webservice,python来写爬虫,爬虫爬来的东西会通过webservice放入数据库,不对数据库进行直接操作,这样的好处是 1、可以专心关注于爬虫程序的实现而不用涉及对数据库的操作,减少失误性 2、多个爬虫程序同时向数据库中发送数据使用webservice 便于管理 3、现用的mysql数据库, 近期准备使用 hadoop 或 hyoertable 如果更新成功 各种爬虫程序的接口不变,只需更改webservice的接口即可,每次数据库的更新都会很方便。
 
我们的页面抓取 和信息抽取是分开的,因为公司需要留下我们抓过的原始网页(类似于百度的 快照) 然后对这些  "快照" 进行信息抽取 不论是抓取还是抽取 一般都使用的正则,应该是因为目标比较明确的缘故 并且熟悉正则的缘故,感觉在我们的抓取中 正则确实要比html分析来的更直观。
 
抓取之中加入了代理验证、异常恢复(抓取过程中因各种意外停止,下次从故障点恢复)  但是没加 多线程、断点续传等
 
这里把 其中的一个抓取发给大家,没设计到什么高深的东西,希望大家不要笑话, 这个爬虫不能直接使用,需要对上传的部分做处理,改成你数据库的样式: )
 
学python 近5个月了 感觉是个非常温馨的语言,深深的喜欢上了它,希望接受它的人能越来越多。
 
数据抽取因为涉及到一些其他的东西 不便发,其实就是一个信息用正则抽取再封装成xml上传的过程 如果大家有需要 我可以更改下发给大家 : )
 
 
 
2009-03-03

DianQ
发件人: Joe  
发送时间: 2009-03-03  18:42:46
收件人: python-cn
抄送:
主题: [CPyUG:80345] Re: 求python小型爬虫
Victor Lin 可真是個好人。


贊一個!

2009/3/3 Victor Lin <Born...@gmail.com>
對於有明確目標的網頁而言,例如
Spider.rar
shuni9@gmail.com.jpg

shell909090

unread,
Mar 3, 2009, 10:07:37 AM3/3/09
to pyth...@googlegroups.com
DianQ 写道:

> 我前段时间也一直用python来进行抓取,不过和大家讨论的不太一样 把可以拿出的拿出来与大家分享一下
>
> 我们使用php搭建webservice,python来写爬虫,爬虫爬来的东西会通过webservice放入数据库,不对数据库进行直接操作,这样的好处是 1、可以专心关注于爬虫程序的实现而不用涉及对数据库的操作,减少失误性 2、多个爬虫程序同时向数据库中发送数据使用webservice 便于管理 3、现用的mysql数据库, 近期准备使用 hadoop 或 hyoertable 如果更新成功 各种爬虫程序的接口不变,只需更改webservice的接口即可,每次数据库的更新都会很方便。
>
> 我们的页面抓取 和信息抽取是分开的,因为公司需要留下我们抓过的原始网页(类似于百度的 快照) 然后对这些 "快照" 进行信息抽取 不论是抓取还是抽取 一般都使用的正则,应该是因为目标比较明确的缘故 并且熟悉正则的缘故,感觉在我们的抓取中 正则确实要比html分析来的更直观。
>
> 抓取之中加入了代理验证、异常恢复(抓取过程中因各种意外停止,下次从故障点恢复) 但是没加 多线程、断点续传等
>
> 这里把 其中的一个抓取发给大家,没设计到什么高深的东西,希望大家不要笑话, 这个爬虫不能直接使用,需要对上传的部分做处理,改成你数据库的样式: )
>
> 学python 近5个月了 感觉是个非常温馨的语言,深深的喜欢上了它,希望接受它的人能越来越多。
>
> 数据抽取因为涉及到一些其他的东西 不便发,其实就是一个信息用正则抽取再封装成xml上传的过程 如果大家有需要 我可以更改下发给大家 : )
>
>
>
> 2009-03-03
>
>

我们也做的是抓取,不过没做异常恢复。严格的异常恢复太困难了,需要保存出错
当时的现场。非通用的异常恢复又太多变。
我们将数据的输出封装成了接口,每次运行的时候动态指定接口。向数据库还是
WebService都不困难。

signature.asc

benluo

unread,
Mar 3, 2009, 8:04:34 PM3/3/09
to python-cn`CPyUG`华蟒用户组
On Mar 3, 1:13 pm, python <malinqi...@gmail.com> wrote:
> 汗,说的越来越深奥。我不是要下载他的小说。我只要他的链接地址,名称,和最新章节的名称和链接。其他的都不要。我不下载小说内容。只想做一个包含上面
> 东西的一个数据库即可!
> OK?
>
最烦你这种人,不用脑子,请教的时候态度还不好。不想用脑子,花钱找人开发去。

benluo

unread,
Mar 3, 2009, 8:06:20 PM3/3/09
to python-cn`CPyUG`华蟒用户组

On Mar 3, 2:03 pm, Jiahua Huang <jhuangjia...@gmail.com> wrote:
> 2009/3/3 Leo Jay <python.leo...@gmail.com>:


>
> > wget编译出来就是native的,不需要其它库的。
>
> 是说 msys 省事点,不会再要啥了还临时装,
> 而且 bash 比 cmd 省事点。

如果机器允许装msys,还是这个东西好使。

benluo

unread,
Mar 3, 2009, 8:06:54 PM3/3/09
to python-cn`CPyUG`华蟒用户组

On Mar 3, 3:20 pm, testisok <testi...@gmail.com> wrote:
> 我写了个应用,可以将整个含有图片的树形目录整个存储/恢复,隐藏地点mysql,可以合作一下,握个抓
>

广告贴?

刘格好

unread,
Mar 3, 2009, 8:14:29 PM3/3/09
to pyth...@googlegroups.com
那是爬虫吗,采集。
那个站我写过,连内容,封面都采下来了,不过现在没有了。数据库都删了。

2009/3/4 benluo <ben...@gmail.com>

卢熙

unread,
Mar 3, 2009, 8:28:15 PM3/3/09
to pyth...@googlegroups.com
这个帖子太好了。我加星了,谢谢Victor Lin 。

2009/3/4 刘格好 <6uh...@gmail.com>

Joe

unread,
Mar 3, 2009, 9:36:27 PM3/3/09
to pyth...@googlegroups.com
我早就加星了。

2009/3/4 卢熙 <lux...@gmail.com>

feng

unread,
Mar 3, 2009, 10:20:17 PM3/3/09
to python-cn`CPyUG`华蟒用户组

Victor LIn 人真好

carol Man

unread,
Mar 4, 2009, 4:06:45 AM3/4/09
to pyth...@googlegroups.com
Victor LIn厚道,最近我也在查这方面的东西,谢谢啦

2009/3/4 feng <fengs...@hotmail.com>



--
=============================
Like eat,like sleep,I'm a 2-feet PIG -_-#
=============================

LaiYonghao

unread,
Mar 4, 2009, 9:11:51 AM3/4/09
to pyth...@googlegroups.com
只要发一大砣源代码出来的你都说好,其它的都不是好。

2009/3/3 Joe <dog...@gmail.com>

Li Xunhao

unread,
Mar 4, 2009, 10:30:49 PM3/4/09
to pyth...@googlegroups.com
哈哈

2009/3/4 LaiYonghao <lanp...@gmail.com>:

--

深水鱼

unread,
Mar 5, 2009, 1:47:35 AM3/5/09
to python-cn`CPyUG`华蟒用户组
Victor Lin 可真是個好人~~ 支持一下
学习中。。。

MuSheng

unread,
Mar 5, 2009, 3:34:18 AM3/5/09
to python-cn`CPyUG`华蟒用户组
我的方法是urllib2+re+re模板,不管那個網站換re的模板設置以及網站分析就行了,爬網的功能模塊不用變。

暈,在哪添加附檔

> ...
>
> 阅读更多 >>

@@

unread,
Mar 5, 2009, 3:36:02 AM3/5/09
to pyth...@googlegroups.com
用邮件的话就是直接发个附件就可以了。。
group还真没用过。。

2009/3/5 MuSheng <mu....@gmail.com>
Reply all
Reply to author
Forward
0 new messages