掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 93823|回复: 48

[教程] 用一个简单的例子讲讲怎样从网站上扒数据

    [复制链接]

该用户从未签到

发表于 2014-6-17 19:21:42 | 显示全部楼层 |阅读模式
3 z# Z+ W" _" {$ G$ j. b( p
一直想找个英语单词词根和前缀、后缀的词典,主要用来辅助记单词. R1 [7 M3 m7 \5 j- x
比如entombed,如果知道en-,知道tomb,这个单词看一遍就记住了,
- F8 X8 r* i2 Q/ ~/ ?有点类似汉字的偏旁部首, H2 p6 m* v# H
找来找去,觉得prefixsuffix.com这个网站还不错,收得比较全,解释比较简明, K. [, G" F' W3 L6 I5 U
但是总不能整天老挂在这网站上,得想个能离线浏览的办法, P* H; p8 H' \( a+ X5 x+ U. b8 Z
他家倒是出了个app放在appstore上,卖18元,说实话有点小贵,人家SOED6才卖18
/ b. t, A! a7 W; h+ v0 ]* Z6 I这还不算,最要命的是从2010年以来这个app一直没更新过,究竟是不再维护了呢?还是已经完美到不用再更新了呢?
% f5 D6 D1 |: K% i; V! e9 D2 _8 a, }要知道这几年ios都有过几次重大升级,万一买了和ios7不兼容,闪退怎么办?岂不是白买
/ T8 k% n+ T" c2 U1 ?, U  u, `$ r$ q
6 q& j! n* @+ D6 I/ H7 ]于是想到有没有可能把他家的数据全给扒下来
9 t' ]0 V& b* Q% a运气不错,这家网站完全没设防,扒数据的整个过程轻松而愉快4 z4 x" I9 }4 Q+ m. {% P
现在就把这个过程详细讲讲。遇到类似问题可以照猫画虎,把附件的代码改改就能工作
2 y) W  K( W& ~; v5 {+ {% u& p5 T5 H我尽量写得比较啰嗦一点,让计算机小白也能看懂
$ p* f# C- Y0 c% M8 j) Y
7 t6 g1 T2 H/ {: M' z9 E" o( Y  E一、网页的构造
! X: e7 ]9 M# t) k这个网站比较简单,和词根相关的网页就两个) I& m0 n: x, m1 J# M
一个是rootchart,点开是张大表,列出最常用的词根. Y: A! f8 ]% `) J% ?( i* p4 h
http://www.prefixsuffix.com/rootchart.php?navblks=10110008 X+ `# ?: J: `6 y) q4 Z
还有一个rootsearch,点开有个search选项,可以自己输入词根查询& ^! w' b; h  S; K. r
http://www.prefixsuffix.com/rootsearch.php
+ U7 |; K2 K! t1 }8 g: I  r; U0 r9 r( X& m2 `4 h
二、先搞第一个网页" S, o6 H5 u8 v. C1 `0 v) L; I
地方找到了,如何下手呢?* U& G& w2 U$ W# j/ b' W: c. v
第一个简单,直接用脚本请求这个页面,把返回结果接住就行
  1. 1 F) R& _6 `/ a6 ~5 e+ }
  2. url = 'http://www.prefixsuffix.com/rootchart.php?navblks=1011000'9 T; T6 H6 Q3 V- c- w2 l
  3. req = urllib2.Request(url)5 A0 Q  R2 H- ^' a7 @8 x) P
  4. response = urllib2.urlopen(req), k" u1 N* e% z9 E+ a& U
  5. page = response.read()
    % R2 ~$ P% m! J! l
  6. print page # 打出来看看返回结果究竟是啥玩意
    5 L0 }/ F5 e0 G( {8 S
复制代码
给计算机小白扫盲: t4 ^% F. g4 `  P$ D  a4 ~
互联网的工作原理是这样的:用户向网站发送请求,网站响应请求返回数据; J% B7 j2 [9 j# X. U3 c; m( q$ D
比如用浏览器看网页这样一个最简单的操作:
5 i: h3 L8 k  I2 j输入一个网址按回车,浏览器就向那个网站发送请求;网站返回的网页数据被浏览器接住,经过解析、渲染呈现出来
' l0 S% l. K# V视频啥的也是一个道理,只不过这时候返回的是视频数据,不是网页数据
" S& X) r- N  O  l% l7 b这里用脚本发的请求,网站返回的数据自然也能用脚本接到

1 t$ F3 X  w) x3 A3 O+ L0 h9 }: }+ ]. a- b. H1 n( U
网页数据拿到了,真正需要的那一小块数据在哪呢,这个可以查一下网页的源码,右键菜单->审查元素,如下图$ w- a$ a# b. I5 e0 z
) F6 J/ i; w$ E/ q7 u. x, g
' t) h8 G3 l* ~4 T+ v
可以看到那块数据就在这个大表里面
  1. <table class="affix">...</table>
复制代码
在那一大篇网页数据里把这个表找到,把里面的内容给抠出来,就是一个超强的python库:BeautifulSoup的拿手好戏2 F0 R7 {  p7 q9 j# j* f, E" G
(这个库使用起来非常简单,文档也非常完善,有不明白的尽可以去这里查询。这里不再多说。
7 ^. a( m+ `3 k+ M# m# ?http://www.crummy.com/software/B ... 4/doc/index.zh.html' \/ _% L( v( ~( M

. d2 y  B! G2 Q4 h于是有下面的代码

  1. + D2 d9 z& |5 y0 r/ Y
  2. soup = BeautifulSoup(page)5 D. T7 \- }# F' L
  3. tb = soup.find('table', {'class': 'affix'}) # 这样就把那个大表给抠出来了3 e: `; @# s! g" O8 r8 _
  4. # 然后再一层一层的剥
    7 _) j. @7 y$ [
  5. if tb:* R. v0 S1 r3 S2 n! h- L
  6.     rows = tb.findAll('tr') # 所有行
    8 L! Y, K! Q! C9 l$ J1 V. T5 l0 }
  7.     for tr in rows:1 u: D9 V1 i" P
  8.        tds = tr.findAll('td') # 每一行的所有列
    0 h' l5 S1 y5 h& ?0 ?  V
  9.        if tds:
    1 r- m4 ?; _) U4 C- }" u( p( J
  10.               。。。& o2 c& I$ b- g$ K! M0 d
复制代码
第一个网页到此解说完毕。( H. v# k) h* `! s# b) T) N5 G
博客类、或者外汇牌价,基金公司的每日净值之类的公告信息,都可以用类似的办法扒数据
# |( h+ C# F4 P$ m2 W5 _. r
8 C' @2 M$ o9 a三、再搞第二个网页3 ]/ ?. C  C# q: A7 ]9 g7 v; @& i
这个稍微有点不同,它的工作原理是这样的
  Z9 I/ ]' W) M/ a# n用户输入关键字,把下拉框和"start","anywhere","end"这两项选好,点击search按钮,
5 g. F: K5 A" Z9 N5 w这时候浏览器会向rootsearch.php这个页面发送请求,捎带着还要把用户刚才输入的这些数据给POST过去,. U3 M1 U2 B' T4 T3 r1 i9 Q9 H
rootsearch.php收到这些用户数据,才知道要干啥、吐出什么东西回来
6 x+ v: p1 b7 e页面url是已经知道的,那么这里的关键问题就是:浏览器究竟把什么数据给POST过去了呢?) p3 V: p  M. r7 b: L, F
还是要查一下网页的源码,如下图
3 g5 `2 `+ G" b8 Y
' s# z) ]+ \' Q! Q  Z" i1 t0 v9 u, n& |+ m' J
可以看到这是一个form,里面有这几个东西正好对应着文本框、下拉框、"start"……:+ }0 U; ^1 ]- b' ~. M
field、find、stype& n% r6 p7 Z: t5 }% B' D
还有个hidden的东西searching,不晓得是啥,不过没关系,它的value是固定的yes- a) F" b1 r' H. R# P
给计算机小白扫盲
. y7 u. I# m0 T3 @9 Y) R" R) Rform叫做提交表单,用来把用户输入的数据提交到网站后台处理
2 Y* a* ~$ G  @. D$ ?0 Q: A) D文本框、下拉框、"start"……这些叫做网页控件
5 B' ^5 s1 Q. |) P& h3 W$ S9 A注意它们的两个属性:name和value,这两个东西都是要提交给后台的,这样网站才知道用户想干嘛

' q+ |! ?, z% t+ h
7 F, c7 a. S, |! O3 ~" @: _& p搞清楚以后,于是有下面的代码

  1. * P+ p: n4 F$ [$ F5 t7 N' O+ v
  2. values = {'field': 'root', 'find': 'ex','searching': 'yes', 'stype': 'anywhere'}
    , D+ M* p1 m$ l" ?( P1 O7 f8 S
  3. # 这里模仿用户查询ex这个词缀,输入‘ex’
    , @5 o9 Y3 j0 G; X
  4. # 扒数据自然是出来的越多越好,因此把下拉框选成root,单选按钮选到anywhere
    . Y; b* ]- N/ E( v; |
  5. # 实际上为了扒到所有的数据,我写了26个字母X26个字母的组合,anywhere/start/end各查一遍  }& P3 b9 T& L. X& B; c" t% u
  6. # 一共发了26X26X3次请求,比较暴力,这种丑陋的代码就不拿出来现了- o& }" ^8 ]8 Y2 l# G
  7. data = urllib.urlencode(values)% X# T- g+ j2 Z5 {* @! W5 Z
  8. print data # 看看变成了什么,是不是很眼熟?( R# f7 M; v! I5 K
  9. req = urllib2.Request(url, data)" }; O+ z: U9 p9 l
  10. page = urllib2.urlopen(req)
    " d, z( m( x- X) |% {, [3 o! E3 M
  11. print page # 打出来看看这回又是啥玩意0 y6 n7 _; p/ o8 e) |+ P2 _7 ~
复制代码
这样就又把数据搞到了,接下来的流程和上面第一个网页的BeautifulSoup那块开始往下一模一样1 l) h: N( V+ O9 K1 |
注:: b5 G) Y8 e) ~2 q- j* i3 _  k% C* P
像这个网站这样每次检索后刷新整个页面的做法已经不多了,. Y# i8 u, I; h+ O
最近大量的网站使用ajax技术,网站不再返回整个html页面把整篇全部刷新% i5 O9 @& P8 \1 O
而是返回一小块html片段,只刷新页面的某一小块,比较环保
; T. M: u2 i) f, H$ C* y或者干脆只返回一大串数据,用网页的javascript解析、生成html,这种就比较头大,数据看着头晕
0 A, V$ K1 U3 X: T' L5 Q! d: _4 v9 T, x* Q6 F
第二个网页到此解说完毕。
3 B% f1 ?# L8 y网站登录类、论坛自动发帖类、订票类、考试报名类、抢沙发类……等等原理上都是这样实现的9 t) q4 f$ W; p5 h# C5 F
/ S3 R3 ^  Q* f. \4 b/ z% e' l
. j/ D0 O3 L6 j* \# S) l
看到这里你应该想明白了,为什么现在各个网站都要限制连接间隔、用图片验证码+ Q5 F) g3 ~8 g+ e+ C$ b
还有用短信发验证码的,有些还搞了数据加密、随机数什么的。。。不这么搞网站服务器就要沦陷了
' y6 Y' m3 J" G0 k! {所以上面的代码通常会遇到网站的各种阻挠,让你抓不到数据,需要你和网站斗智斗勇4 L* Y5 \; U+ u  x5 _2 R) Y/ ^8 Z
像图片验证码这玩意最近已经都不太好使了,有人收集大量的验证码图片建特征数据库,一样能突破网站的防线* }8 t3 o' m9 V$ S" `" d
于是最近很多网站的图片验证码搞得极其扭曲,以至于本人用肉眼看半天都输错,  Y& P" y$ ~( a$ B  B, J9 _: ?. P
已经到了人类都无法识别的地步。这种网站估计是留着给外星人用的。" e* x  {3 C& D# b/ }

' }: ]0 F3 N4 J/ |. D

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

2

查看全部评分

本帖被以下淘专辑推荐:

  • TA的每日心情
    奋斗
    2018-7-17 21:49
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2018-7-28 13:22:31 | 显示全部楼层
    首先,非常感謝樓主。0 C+ [+ l- |; }! w) X/ L; I% G
    我獲得affix2.txt后,分別用MdxBuilder3.0、4.0X32、x64創建mdx,4.0版都沒問題,但3.0版總是創建失敗,
    ' |; ~- l5 q: U. I3 C( [4 @4 X7 M' U2 ?Done!9 @4 Q' N, c1 o5 c9 n% g
    Original index size = 0KB, compressed size = 0KB, compression ratio = 314%+ R: {- F/ B$ X
    Time used for this section: 0 seconds7 ^' k% Q# s: B% F+ C7 b
    Begin processing data contents...+ ~7 x7 Q; T1 B3 p0 M/ ^/ h- [
    Failed to read from source file:C:\Users\frankly\Desktop\affix2.txt for record(line):1
    : U, I! N0 k  J) C1 ^. Y8 B8 {4 f+ ~Conversion failed!6 [' f0 u+ y7 x$ F1 i8 i* h
    請各位指教,謝謝。
  • TA的每日心情
    擦汗
    2022-3-12 13:24
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2016-10-12 16:46:54 | 显示全部楼层
    bt4baidu 发表于 2014-6-29 23:27$ Q$ Y9 O0 m- R+ e, y. b
    这种静态网页按我上面的说明毫无压力吧
    5 ?; |- T4 P; x+ |1 c3 w0 O比如http://www.nsii.org.cn/node/80/A/Acanthus/Acanthus%20leu ...

    " b6 o$ Z9 o, R: C9 O! Z, ^楼主问一下您的 wish list 上的 英语电子词典都找到了吗?
    ) c3 K6 ~# g3 v0 l: d* k5 t- k- A8 J; o辛苦了
    : a7 e4 a+ S, R' t7 o0 g如果找到了能不能也给我分享一下? 邮箱[email protected]
      ]1 a  |! h$ ^/ j- L* J+ G( L\thanks\a\lot\  :0 ' e' p" q% k# Q5 x. y2 ~. v
    :)

    该用户从未签到

    发表于 2016-5-16 18:10:45 | 显示全部楼层
    楼主发出来的代码好整洁! 学习耶, K* K( |! A' K

    ( [3 x, l' v4 w; \% a请教一下 26x26 字母的问题。能不能教教怎么捕获异常?提交上去的两个字母可能是没有的,比如 xx, 这样的话,怎么处理?
  • TA的每日心情
    难过
    2023-11-26 08:44
  • 签到天数: 49 天

    [LV.5]常住居民I

    发表于 2014-6-17 20:14:43 | 显示全部楼层
    辛苦了 ,O(∩_∩)O谢谢
  • TA的每日心情
    无聊
    2018-6-29 05:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-6-18 00:15:43 | 显示全部楼层
    ?我用火车采集器在采集百度百科呢。采集了1000000多万条了。制作了4.2万条,300多兆,到时候做个词典在电脑上查。估计做出来都有20g了吧,800多万条了

    点评

    我当初是保存的gzip压缩包. 20多G. 解压后至少70G. good luck!  发表于 2014-9-1 16:29
    冏,20G,硬盘剩余空间都不够了  发表于 2014-6-18 10:05

    该用户从未签到

    发表于 2014-6-18 02:15:21 | 显示全部楼层
    好贴要顶!' r0 R$ z1 m2 D* U9 v$ n
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 2246 天

    [LV.Master]伴坛终老

    发表于 2014-6-18 09:10:56 | 显示全部楼层
    以前的百度百科2012,有30g,现在已经不更新了,如果楼主出新版,那可是大好事啊,预祝成功!

    点评

    个人感觉百度百科编得有点糙啊,不如维基严谨。这里有epwing格式的各语言版维基http://sourceforge.jp/projects/boookends/releases/,一直在更新  发表于 2014-6-18 10:04
  • TA的每日心情
    难过
    2023-11-26 08:44
  • 签到天数: 49 天

    [LV.5]常住居民I

    发表于 2014-6-29 10:00:52 | 显示全部楼层
    楼主,请帮忙,这个网站的如何扒http://www.nsii.org.cn/newquery?qs=*:*&fq=kingdom:Plantae ?

    该用户从未签到

     楼主| 发表于 2014-6-29 23:27:41 | 显示全部楼层
    wenlishahsa 发表于 2014-6-29 10:00
    : [& V% [9 Q  T楼主,请帮忙,这个网站的如何扒http://www.nsii.org.cn/newquery?qs=*:*&fq=kingdom:Plantae ?
    9 C! r# b5 f( z! {7 u) ~
    这种静态网页按我上面的说明毫无压力吧
    : m$ R) b- z( c: e: z; J比如http://www.nsii.org.cn/node/80/A ... hus%20leucostachyus
    ; g- d! z2 w) U8 S7 i3 T这个页面,找到* ~/ u4 ^' y( u, Y$ e$ _
    <div class="content clearfix">
    % A# |% }: ]$ f& Z...: G9 J; K( }' V" A# y$ W
    </div>
    ; |% n+ @, C* B# I; K0 |把里面的东西抠出来就是
  • TA的每日心情
    难过
    2023-11-26 08:44
  • 签到天数: 49 天

    [LV.5]常住居民I

    发表于 2014-6-30 16:49:41 | 显示全部楼层
    本帖最后由 wenlishahsa 于 2014-6-30 16:58 编辑
    4 q& N0 T) r5 v: h% G  S6 s" p$ h. |# L
    >>> url = 'http://www.prefixsuffix.com/rootchart.php?navblks=1011000'+ U* M7 Q8 y/ M5 t2 E: t; T, _6 Z
    >>> req = urllib2.Request(url)
    8 `& ?2 t9 A5 f3 l, PTraceback (most recent call last):2 k/ m3 Q3 I. [+ T# s: u" M
      File "<pyshell#1>", line 1, in <module>
      o; I$ b$ K% ~% K' b    req = urllib2.Request(url)
    5 @9 W1 \" b) F  X" {0 Q' g1 _- q1 y7 ?NameError: name 'urllib2' is not defined>>> 楼主,请问,为什么我照你的执行会出错呢?

    点评

    出错了可以把错误拷下来直接百度  发表于 2014-6-30 17:26
    加油,你要是能把这个网站扒下来转成mdx,大家就有福了。可以先抓目录,把所有的链接抓到,然后按链接再抓网页和图片。这个网站的图片异常精美,确实让人心动,做成词典放ipad上教育小朋友很不错的。  发表于 2014-6-30 17:25
    import urllib2先  发表于 2014-6-30 17:22
  • TA的每日心情
    难过
    2023-11-26 08:44
  • 签到天数: 49 天

    [LV.5]常住居民I

    发表于 2014-6-30 18:30:34 | 显示全部楼层
    wenlishahsa 发表于 2014-6-30 16:49
    6 C6 p7 s* l* b0 x1 `# ]) I+ Q>>> url = 'http://www.prefixsuffix.com/rootchart.php?navblks=1011000'$ d% l2 |5 U" A. R! c) Z. n, Z5 I
    >>> req = urllib2.Request(url ...
    + ^+ F: D# j5 y4 x
    谢谢,解决了

    该用户从未签到

    发表于 2014-7-5 21:10:28 | 显示全部楼层
    感谢分享
  • TA的每日心情

    2022-1-3 20:06
  • 签到天数: 384 天

    [LV.9]以坛为家II

    发表于 2014-7-14 19:50:32 | 显示全部楼层
    我是小白。请问百度哥什么叫 “用脚本请求这个页面” 怎么做~ ~

    该用户从未签到

    发表于 2015-9-7 16:50:18 | 显示全部楼层
    版主您好,本人没有学过这些语言,也不会编写,能否下载 http://www.esdict.cn/ 一下的文件内容吗?多谢了。

    该用户从未签到

    发表于 2015-9-7 22:20:14 | 显示全部楼层
    有用的实例  经典的例解 感谢楼主 支持楼主

    该用户从未签到

    发表于 2015-10-29 13:48:35 | 显示全部楼层
    先备着,改天自己尝试一下。

    该用户从未签到

    发表于 2015-10-31 15:05:48 | 显示全部楼层
    讲的简单明了,受教了……

    该用户从未签到

    发表于 2015-12-2 17:48:15 | 显示全部楼层
    学习了,受益良多。; t8 k! d3 v! _/ ], n
    狂顶楼主。。。

    该用户从未签到

    发表于 2015-12-5 22:24:37 | 显示全部楼层
    学习受教了!

    该用户从未签到

    发表于 2015-12-9 14:07:13 | 显示全部楼层
    almighty 楼主,2 Y; @/ k0 R2 v0 l
    可以把这个抓下来离线用吗?
  • TA的每日心情

    2023-9-27 11:08
  • 签到天数: 52 天

    [LV.5]常住居民I

    发表于 2016-1-2 12:14:03 | 显示全部楼层
    学习了,支持这种技术贴。

    该用户从未签到

    发表于 2016-1-2 12:25:09 | 显示全部楼层
    技术流!问题是能不能给给结果呢。。。。
  • TA的每日心情
    开心
    2019-6-16 20:48
  • 签到天数: 221 天

    [LV.7]常住居民III

    发表于 2016-1-2 21:29:45 | 显示全部楼层
    辛苦了 ,O(∩_∩)O谢谢

    该用户从未签到

    发表于 2016-2-2 12:02:30 | 显示全部楼层
    好帖,谢谢分享
  • TA的每日心情
    开心
    2019-6-16 20:48
  • 签到天数: 221 天

    [LV.7]常住居民III

    发表于 2016-2-17 10:31:28 | 显示全部楼层
    这个方法我得好好学习一下。
  • TA的每日心情
    无聊
    5 小时前
  • 签到天数: 1994 天

    [LV.Master]伴坛终老

    发表于 2016-2-20 17:53:09 | 显示全部楼层
    Python写爬虫爬...
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-27 16:39 , Processed in 0.085734 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

    快速回复 返回顶部 返回列表