掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 97673|回复: 48

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

    [复制链接]

该用户从未签到

发表于 2014-6-17 19:21:42 | 显示全部楼层 |阅读模式
$ E5 t. Y8 n; l6 Y7 {- ~% `3 F) ~& L
一直想找个英语单词词根和前缀、后缀的词典,主要用来辅助记单词. S; P& m8 y& o. x; D
比如entombed,如果知道en-,知道tomb,这个单词看一遍就记住了,& J9 p7 i4 v# D& V
有点类似汉字的偏旁部首
4 ^4 ?8 d( O0 D' z+ K找来找去,觉得prefixsuffix.com这个网站还不错,收得比较全,解释比较简明* {( |  M7 v* E
但是总不能整天老挂在这网站上,得想个能离线浏览的办法& S8 f5 L2 Q. g; _5 n
他家倒是出了个app放在appstore上,卖18元,说实话有点小贵,人家SOED6才卖18: m2 i2 r1 v' J4 m
这还不算,最要命的是从2010年以来这个app一直没更新过,究竟是不再维护了呢?还是已经完美到不用再更新了呢?
% z) {/ [5 |1 m要知道这几年ios都有过几次重大升级,万一买了和ios7不兼容,闪退怎么办?岂不是白买# L, Y6 G  _1 C* O6 N+ d
! T. V3 d( U3 a5 S4 \( j4 i
于是想到有没有可能把他家的数据全给扒下来
6 V/ Q4 d( |& j' L4 r. F1 o2 U- o* G运气不错,这家网站完全没设防,扒数据的整个过程轻松而愉快! K9 I  |1 l" Q0 _
现在就把这个过程详细讲讲。遇到类似问题可以照猫画虎,把附件的代码改改就能工作
& V9 b6 r' r- u+ s3 B9 K我尽量写得比较啰嗦一点,让计算机小白也能看懂9 r  ~5 q6 X3 q9 l+ K! \

9 X' G# \7 q! m: S) p( b& E一、网页的构造- D# n& ]. |: O; m
这个网站比较简单,和词根相关的网页就两个6 g4 e" W& Z3 g- g/ O4 j
一个是rootchart,点开是张大表,列出最常用的词根) {1 z& y  }) g9 B$ O  n. c( w: T: ?
http://www.prefixsuffix.com/rootchart.php?navblks=1011000
5 D  |6 S* [. L4 _还有一个rootsearch,点开有个search选项,可以自己输入词根查询  d7 E- A2 w& Q1 }& W, x; f# ?: {
http://www.prefixsuffix.com/rootsearch.php
, ~5 J7 Y  U$ y  O3 ?/ U  ^; q- c, r2 d: {
二、先搞第一个网页" @  g* s& a% c( p' q, V$ |
地方找到了,如何下手呢?
0 s9 ]) F/ F9 |# Z8 C  I! T第一个简单,直接用脚本请求这个页面,把返回结果接住就行

  1. + X2 i% r! J8 M( e# X- i
  2. url = 'http://www.prefixsuffix.com/rootchart.php?navblks=1011000'
      t% w* l1 D" h  Z; g
  3. req = urllib2.Request(url)' b1 O( W$ w0 U$ g4 H5 g# _
  4. response = urllib2.urlopen(req)1 j# s, i8 Y. t0 _+ `$ t
  5. page = response.read(); i; d- w* v* Z( S" o
  6. print page # 打出来看看返回结果究竟是啥玩意
    , G- k6 h$ E, L% V4 q8 x- C! a: R
复制代码
给计算机小白扫盲( d0 J8 B- O: [8 {: S8 n
互联网的工作原理是这样的:用户向网站发送请求,网站响应请求返回数据6 F0 N* `5 D! `7 P* Z
比如用浏览器看网页这样一个最简单的操作:
4 h) H! {9 O& B+ M. l* y输入一个网址按回车,浏览器就向那个网站发送请求;网站返回的网页数据被浏览器接住,经过解析、渲染呈现出来0 v: V" H1 U8 E
视频啥的也是一个道理,只不过这时候返回的是视频数据,不是网页数据
0 z$ o2 d% O1 e这里用脚本发的请求,网站返回的数据自然也能用脚本接到

  D+ a" `% S1 \/ l: w" S1 B2 `" [; W: a( }% ^& I
网页数据拿到了,真正需要的那一小块数据在哪呢,这个可以查一下网页的源码,右键菜单->审查元素,如下图8 e0 A) t2 `; u5 ^) x2 Z& ?  X
, T! Z6 z. k- E
( E" V* U* t: Q% _% t# M- Z
可以看到那块数据就在这个大表里面
  1. <table class="affix">...</table>
复制代码
在那一大篇网页数据里把这个表找到,把里面的内容给抠出来,就是一个超强的python库:BeautifulSoup的拿手好戏$ P! l5 f: G0 \7 U: p
(这个库使用起来非常简单,文档也非常完善,有不明白的尽可以去这里查询。这里不再多说。; J( m  F2 P5 X5 w2 R
http://www.crummy.com/software/B ... 4/doc/index.zh.html
7 c) M( m# W* u0 r. C& g0 Q5 H7 [" c6 q$ @1 u
于是有下面的代码
  1. 5 b- U; G4 D% V7 D8 u
  2. soup = BeautifulSoup(page)
    2 N; g  L  c2 m6 y7 t0 h
  3. tb = soup.find('table', {'class': 'affix'}) # 这样就把那个大表给抠出来了# y4 Y1 }. W4 U" V& }# b; b0 ]
  4. # 然后再一层一层的剥) C4 O) J% _& G5 b/ v" r9 g  I" T- _# U
  5. if tb:
      m; B; C! O6 j% F& s2 z9 T
  6.     rows = tb.findAll('tr') # 所有行1 X$ l) m% G) \; e( X
  7.     for tr in rows:
    - x5 \+ P8 h; H5 ~4 Q5 V. f! R+ v' ~. g0 _
  8.        tds = tr.findAll('td') # 每一行的所有列$ r4 x" @6 `! F2 T
  9.        if tds:
    * O: P2 _% o& k- _: K6 ?
  10.               。。。
    ( B" z# D* c) o: c# o$ }
复制代码
第一个网页到此解说完毕。
) S- n6 A+ }3 f) Z% U博客类、或者外汇牌价,基金公司的每日净值之类的公告信息,都可以用类似的办法扒数据9 U7 q" r) H/ N
) ~* b9 D# k! r2 H+ V- J
三、再搞第二个网页3 M. Q$ y& C3 M
这个稍微有点不同,它的工作原理是这样的
) f" j' s6 C* M; A* t# j" K2 E用户输入关键字,把下拉框和"start","anywhere","end"这两项选好,点击search按钮,  S$ B( R9 I, |- F; A: ^
这时候浏览器会向rootsearch.php这个页面发送请求,捎带着还要把用户刚才输入的这些数据给POST过去,
4 M* X4 r$ e. A3 \rootsearch.php收到这些用户数据,才知道要干啥、吐出什么东西回来* _. y& S0 _# c1 w
页面url是已经知道的,那么这里的关键问题就是:浏览器究竟把什么数据给POST过去了呢?
. Q' R2 b' J+ L. y还是要查一下网页的源码,如下图
/ J6 c; Q( @1 G7 j2 Q4 i
! p; H( j" C, [! b
# H  `2 N" }- a6 c& [9 o6 I4 {可以看到这是一个form,里面有这几个东西正好对应着文本框、下拉框、"start"……:
9 ^& @2 \+ z1 `" w/ L0 b, vfield、find、stype& Y  q5 Y2 P) q( g; o
还有个hidden的东西searching,不晓得是啥,不过没关系,它的value是固定的yes
3 C8 Z4 U" @4 o! s" O6 B给计算机小白扫盲. U& p( V0 g3 B
form叫做提交表单,用来把用户输入的数据提交到网站后台处理6 e  x  L/ V% u4 n6 k7 ]9 p
文本框、下拉框、"start"……这些叫做网页控件: C" ^- E* }" A/ R& K6 c
注意它们的两个属性:name和value,这两个东西都是要提交给后台的,这样网站才知道用户想干嘛
' Y/ A+ ^; T8 W" Z8 Q1 ~
' K( s# q! r5 @& ~5 ?# v7 p) e
搞清楚以后,于是有下面的代码

  1. # P* F5 n$ Y% Q) p, t3 w
  2. values = {'field': 'root', 'find': 'ex','searching': 'yes', 'stype': 'anywhere'}* h$ l9 y, _: ~9 G1 f" c# f
  3. # 这里模仿用户查询ex这个词缀,输入‘ex’5 M. q- C* X. ~+ D1 y2 i
  4. # 扒数据自然是出来的越多越好,因此把下拉框选成root,单选按钮选到anywhere7 M4 `5 A/ r" R
  5. # 实际上为了扒到所有的数据,我写了26个字母X26个字母的组合,anywhere/start/end各查一遍
    : ^0 Z/ B  h) R9 C9 Q5 T* r
  6. # 一共发了26X26X3次请求,比较暴力,这种丑陋的代码就不拿出来现了
    3 e" b& U, M+ B+ F+ F% C
  7. data = urllib.urlencode(values)
    / k+ {3 J; ?, g# F1 [
  8. print data # 看看变成了什么,是不是很眼熟?" w0 `- z* w# C, n! I+ H
  9. req = urllib2.Request(url, data)
    ; B  K; m, C$ a+ j2 D2 H
  10. page = urllib2.urlopen(req)
    7 M- F% u* e& N1 S3 W
  11. print page # 打出来看看这回又是啥玩意0 T& @. V! n7 d
复制代码
这样就又把数据搞到了,接下来的流程和上面第一个网页的BeautifulSoup那块开始往下一模一样
8 ?# |/ `$ l1 {5 c4 A' R, P: |注:. O9 h. y6 X# ~2 _# F. J! V& t6 ^
像这个网站这样每次检索后刷新整个页面的做法已经不多了,$ U' y, Y, k7 S- i5 D7 [4 a+ C
最近大量的网站使用ajax技术,网站不再返回整个html页面把整篇全部刷新
( D% c% @. _  v: [  Q而是返回一小块html片段,只刷新页面的某一小块,比较环保& u+ x. ]4 B+ B+ }' T
或者干脆只返回一大串数据,用网页的javascript解析、生成html,这种就比较头大,数据看着头晕
- x# O; M7 O; v: P- w
' k5 p" O. ~6 q第二个网页到此解说完毕。3 R* q* `% d: S: ]; {
网站登录类、论坛自动发帖类、订票类、考试报名类、抢沙发类……等等原理上都是这样实现的
# p, N3 u/ n( O6 r7 F  n# b& {) j! Y; T
: E2 F  a  e) ?# n  L; Q+ w: o3 H) P
看到这里你应该想明白了,为什么现在各个网站都要限制连接间隔、用图片验证码
$ A4 f: D: x' N( T还有用短信发验证码的,有些还搞了数据加密、随机数什么的。。。不这么搞网站服务器就要沦陷了
( s( Y" I! H" Z- ^& M+ E所以上面的代码通常会遇到网站的各种阻挠,让你抓不到数据,需要你和网站斗智斗勇
8 i' A7 ^- }, l6 K2 @) X% {) v像图片验证码这玩意最近已经都不太好使了,有人收集大量的验证码图片建特征数据库,一样能突破网站的防线: j3 H6 O+ z9 N6 ~
于是最近很多网站的图片验证码搞得极其扭曲,以至于本人用肉眼看半天都输错,% v+ P. |8 L% D% p! x2 ~6 P! {+ z6 Z
已经到了人类都无法识别的地步。这种网站估计是留着给外星人用的。) }7 @/ Y  s$ j- F: v% E) F
  E! o5 i7 |! k8 h

本帖子中包含更多资源

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

x

评分

2

查看全部评分

本帖被以下淘专辑推荐:

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

    [LV.1]初来乍到

    发表于 2018-7-28 13:22:31 | 显示全部楼层
    首先,非常感謝樓主。3 v4 V, p- |8 V; z2 F" S5 \
    我獲得affix2.txt后,分別用MdxBuilder3.0、4.0X32、x64創建mdx,4.0版都沒問題,但3.0版總是創建失敗,0 y, `/ F/ z, A; B
    Done!
      r* k* A; P0 A: l% ^" nOriginal index size = 0KB, compressed size = 0KB, compression ratio = 314%
    ' ~' _) f/ y$ T! N! STime used for this section: 0 seconds
    . }+ B% O4 I7 @+ x' v* VBegin processing data contents...
    . Z# ?; Z% ]1 ^0 x1 RFailed to read from source file:C:\Users\frankly\Desktop\affix2.txt for record(line):1" ~) ]( o$ P' q. x' `
    Conversion failed!2 ^, X) b* G! V2 n) h' v
    請各位指教,謝謝。
  • TA的每日心情
    擦汗
    2022-3-12 13:24
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2016-10-12 16:46:54 | 显示全部楼层
    bt4baidu 发表于 2014-6-29 23:27% I3 x" C6 ]; C. F6 x5 p- {
    这种静态网页按我上面的说明毫无压力吧
    ; p9 M# w! T$ i7 _# R9 A比如http://www.nsii.org.cn/node/80/A/Acanthus/Acanthus%20leu ...
    7 n) U3 R; l2 q" w2 D" I
    楼主问一下您的 wish list 上的 英语电子词典都找到了吗?
    1 C1 M: T. U0 `辛苦了( M# c, C7 k& P# q
    如果找到了能不能也给我分享一下? 邮箱[email protected]
      p4 t. p3 m8 T1 I9 b\thanks\a\lot\  :0
    & i. G4 f5 K& a:)

    该用户从未签到

    发表于 2016-5-16 18:10:45 | 显示全部楼层
    楼主发出来的代码好整洁! 学习耶! z7 a8 E  ^3 I; ?

    ! C0 T2 B  g* r( Q7 L, g6 B请教一下 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 | 显示全部楼层
    好贴要顶!
    ; d: t5 Q) e- }$ x8 B# @
  • TA的每日心情
    开心
    2026-5-17 05:44
  • 签到天数: 2908 天

    [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 - J/ u5 U6 K+ ?; f5 X* X
    楼主,请帮忙,这个网站的如何扒http://www.nsii.org.cn/newquery?qs=*:*&fq=kingdom:Plantae ?
    * G- h# q/ W# ]
    这种静态网页按我上面的说明毫无压力吧
    + r$ F, N3 K( ?* M( U7 f6 G比如http://www.nsii.org.cn/node/80/A ... hus%20leucostachyus
    " Y$ Y! O5 i$ Z. _) K" t1 _& R这个页面,找到
    $ v" k; K' X; y, V) ?. I& F. g6 C- Q<div class="content clearfix">! E! r4 [: A$ C9 P& ~( s9 M
    ...' M  S8 S$ B* w
    </div>6 r; p3 ~! I0 V/ N3 U
    把里面的东西抠出来就是
  • TA的每日心情
    难过
    2023-11-26 08:44
  • 签到天数: 49 天

    [LV.5]常住居民I

    发表于 2014-6-30 16:49:41 | 显示全部楼层
    本帖最后由 wenlishahsa 于 2014-6-30 16:58 编辑 . _* p* A1 o( s
    * _, i, z. r7 y- l9 D
    >>> url = 'http://www.prefixsuffix.com/rootchart.php?navblks=1011000'
    - X6 w( y3 x: `) r! G/ S>>> req = urllib2.Request(url)
    : [) i% Y, K$ a9 a! u1 T& bTraceback (most recent call last):8 K: X6 I; m& B7 l1 {! g
      File "<pyshell#1>", line 1, in <module>0 L) W* o4 C& H& B/ R8 n
        req = urllib2.Request(url)# q! h5 p4 {5 r  I, I
    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
    7 s9 H9 T3 L5 b. n, {- I>>> url = 'http://www.prefixsuffix.com/rootchart.php?navblks=1011000'
    - {: |) X7 k# d' A& ~4 k0 C+ D>>> req = urllib2.Request(url ...

    5 b2 a0 \1 i. H  l. B5 |7 b, c. g谢谢,解决了

    该用户从未签到

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

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

    [LV.9]以坛为家II

    发表于 2014-7-14 19:50:32 | 显示全部楼层
    我是小白。请问百度哥什么叫 “用脚本请求这个页面” 怎么做~ ~
  • TA的每日心情
    开心
    2026-1-23 23:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 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 | 显示全部楼层
    学习了,受益良多。9 m: G# B. x% k) q+ f  m
    狂顶楼主。。。

    该用户从未签到

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

    该用户从未签到

    发表于 2015-12-9 14:07:13 | 显示全部楼层
    almighty 楼主,
    1 H7 a( j; @4 m( j3 B! p; X可以把这个抓下来离线用吗?
  • 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的每日心情
    无聊
    17 分钟前
  • 签到天数: 2777 天

    [LV.Master]伴坛终老

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

    本版积分规则

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

    GMT+8, 2026-7-16 22:58 , Processed in 0.026143 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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