数学建模社区-数学中国

标题: [分享] [DataScience] 手把手教你用python抓网页数据 [打印本页]

作者: 耀眼的讽刺    时间: 2015-12-4 16:22
标题: [分享] [DataScience] 手把手教你用python抓网页数据
这条帖子也是小伙伴分享给我的,觉得不错,分享给大家,关于网页数据提取的,对于一些少数据或是在网页上拷数据的数学建模题目来说很有用!
! e$ D" n+ h/ q7 c  ~再次声明一下,本帖是转发贴,感谢原作者:EroicaCMCS,以下是原帖地址:http://www.1point3acres.com/bbs/thread-83337-1-1.html
! x+ Y; i, M# @7 h+ D1 Z前言:
数据科学越来越火了,网页是数据很大的一个来源。最近很多人问怎么抓网页数据,据我所知,常见的编程语言(C++,java,python)都可以实现抓网页数据,甚至很多统计\计算的语言(R,Matlab)都有可以实现和网站交互的包。本人试过用java,python,R抓网页,感觉语法各有差异,逻辑上是一样的。我准备用python来大概讲讲抓网页是什么概念,具体的内容要自己看手册或者google别人的博客,这里算是抛砖引玉了。水平有限,出现错误或者有更好的办法,欢迎讨论。
1 f8 M, ^- ^* e; F# ?' D) N
+ K0 c( z# S3 C9 B7 |  ^步骤一:熟悉Python的基本语法。1 @! I& i% [/ I' a1 g% m% w/ ?
已经熟悉Python的直接跳到步骤二。) Q9 z+ ^, `& t2 Q! Y) Q  Z  k. I
Python是门比较容易入门的编程语言,如何上手视编程基础而定。
) y1 O0 Q2 Z3 {& c(1) 如果有一定编程的基础,建议看google's python class,链接https://developers.google.com/edu/python/?hl=zh-CN&csw=1
6 H& @3 s: Y1 H0 N% a  |+ B这个是一个为期两天的短期培训课程(当然,是两个全天),大概是七个视频,每个视频之后给编程作业,每个作业一个小时之内可以完成。这是我学习python的第二门课(第一门是codecademy的python,很早之前看的,很多内容都记不得了),当时每天看视频+编程作业一个多小时,六天弄完,效果还不错,用python写基本的程序没有问题。0 {8 Q  v0 }' V
(2) 如果是没有任何编程基础,建议看coursera上Rice University开的An Introduction to Interactive Programming in Python。这门课我没有跟过,但是看coursetalk的评论反映非常好,地里也有同学评论(点这里),课程链接:https://www.coursera.org/course/interactivepython。Udacity上的CS101也是不错的选择,地里有相关的讨论帖(点这里),而且这门课就叫做build a search engine,会专门讲一些和网络相关的module。其他学习资源还有code school和codecademy,这些资源也是挺不错的,但是编程量太少,初学者还是系统的跟课、多练练手来打好基础吧。7 P' C0 \/ V7 f1 _+ E2 x, m
当然,每个人的偏好不同,我推荐的不一定适合你。可以先看看这个帖子【长期加分贴】介绍你上过的公开课里面其他人是怎么说的,或者上coursetalk.org看看课程评论,再决定吧。9 _0 c8 a( B7 J

. Z; q# ]8 W6 ]3 c1 f- E. @0 U, n  p
步骤二:学会如何与网站建立链接,得到网页数据。
7 T  q' m4 A+ g& D8 L1 h, x3 y6 b写脚本与网站进行交互,要熟悉python和网页相关的几个module(urllib,urllib2,httplib)中的一个,知道一个即可,其他的都类似的。这三个是python提供的和网页交互的基本module,还有其他的一些,比如:mechanize和scrappy,我没有用过,可能有更好的性能,欢迎了解的来补充。基本的网页抓取,前面的三个module足矣。
, R5 i% V  h; k下面的代码演示如何用urllib2与google scholar进行交互,获得网页信息。
) A0 ?5 X3 {+ r& `) y' Y+ Q2 I5 j4 V3 f# L
复制代码
# X# F/ T/ e0 v" S& p  {以上的代码就把在google scholar上查询On Random Graph的结果返回到doc这个变量中了,这个和你打开google scholar搜索On Random Graph,然后将网页右键保存的效果是一样的。0 \, @: n" L0 j, O0 O5 {
; k! N  {, V. M" w1 U
步骤三、解析网页
- h" L% \/ W( l1 m2 L上面的步骤得到了网页的信息,但是包括了html标签,你要把这些标签去掉,然后从html文本中整理出有用的信息,
) G0 ^# _" T( d$ b你需要解析这个网页。3 G; }0 X5 C: S) y
解析网页的方法:
7 s( C$ e* e+ M1 p$ ]+ K7 k(1) 正则表达式。正则表达式很有用,熟悉它节省很多的时间,有时候清洗数据不用写脚本或者在数据库上查询,直接在notepad++上用正则表达式组合使用就行了。如何学习正则表达式建议看:正则表达式30分钟入门教程,链接:http://deerchao.net/tutorials/regex/regex.htm
& a" k( q. z% k, l( a(2) BeautifulSoup模块。BeautifulSoup是一个很强大的模块,能把html文件解析成一个对象,这个对象是一棵树。我们都知道html文件是树状的,比如 body -> table -> tbody -> tr,对于tbody这个节点,有很多个tr的子节点。BeautifulSoup可以很方便的取到特定的节点,对单个节点也可以取它的sibling node。网上有很多相关的说明,这里不细说,只演示简单的代码:
: {  E$ o4 t  C: y(3) 上面两种方法结合使用。) ?) _: g1 j1 Y! {
* g  ]% |2 N1 u6 {. v: U$ M
复制代码7 Y. w1 M% A- e5 \
( J; }/ V# H! a  H1 k' a
这些都是我在一个分析citation network的项目的代码。顺便一提,我从google scholar上抓取paper的信息以及引用列表的信息,访问了大概1900次左右的时候给google block了,导致这个片区的ip一时无法登陆google scholar。- V9 M9 ?. ?9 T/ d

! X% c0 |& ?- E" c( I: d: e步骤四:存取数据
+ i$ w  W6 x9 n好不容易抓了数据,现在只是存储在内存中,必须保存起来才能利用。7 m) L0 w; T6 X& U& ^9 f8 o" }
(1) 最简单的方法之把数据写进txt文件中,Python中可以用如下代码实现:
8 W/ F  r* F2 ]6 b" j' g/ u9 H
9 b4 |+ q' p+ x- o- w% L, K! M2 w* R" P' R" v9 o
复制代码
: L- _/ K; A4 e& ^3 M. w& M  M9 ~* b, M& k这样,就把从网页上抓到并且解析了的数据存储到本地了,是不是很简单?
6 K8 O+ q! I- o% I(2) 当然,你也可以不写入txt文件中,而是直接连接数据库,python中的MySQLdb模块可以实现和MySQL数据库的交互,把数据直接倒到数据库里面,与MySQL数据库建立链接的逻辑和与网站服务器建立链接的逻辑差不多。如果之前有学习过数据库,学习用MySQLdb模块实现和数据库的交互是很简单的;如果没有,则要借助在coursera\stanford openEdX平台上都有开设的Introduction to Database来系统学习,w3school用来参考或者当成手册。
3 W% A; W0 j7 r1 K; }- P9 f- ZPython能够链接数据库的前提是数据库是开着的,我用的是 win7 + MySQL5.5,数据库在本地。
: c* k9 y: u' [+ b. m# N5 o6 v; I& ^: L; }/ {6 D- z& |0 [
复制代码! [5 i" O5 [+ P8 m- d
使用MySQLdb模块代码示例:
! r  E9 Z6 M% i& l2 s0 ?" ]1 x- W, j+ B+ @
复制代码) T( T3 X8 ?: }4 A9 D
$ t2 g9 K% r/ x
这样就实现了Python和数据库之间的交互。除了MySQL数据库外,python的PyGreSQL模块可以支持postgreSQL数据库,道理类似的。还有,如果你的网页里面包含了中文,设置编码格式会非常的麻烦,需要服务器、Python、数据库和数据库界面采用相同的编码格式才能不出现乱码,如果真的出现了中文乱码的问题,请相信,你不是一个人!!去google一下吧,成千上万的人碰到过这种问题。
0 G$ M1 R. a8 ?9 A# p: R- g关于编码的问题,附一篇我看到的博文<python编码问题总结>:2 w/ S- v3 u" D7 o! p) v
http://www.xprogrammer.com/1258.html
7 u5 ?* I" O- o1 T/ o. f
1 }: r" O- w% g2 y3 e: A后记:! {& n8 J- |9 [# o% T/ J
上面介绍了抓取网页数据的方法,抓取数据只是一小步,如何分析数据就是大学问了,欢迎讨论。; s. p  Y0 T3 Y7 M: F
上面有什么地方讲不清楚的,欢迎交流。% B. p8 ]1 v/ ~4 v

$ W& c* o  Z5 ]7 g( c0 L1 Y特别注意:
4 G2 M$ d# s2 R0 L! s: j, I" h. y1 }大规模抓取网站会给网站的服务器带来很大的压力,尽量选择服务器相对轻松的时段(比如凌晨)。网站很多,不要拿一亩三分地来做试验。
, G# z/ k0 H+ |6 qPython的time模块的sleep()方法可以让程序暂停一段时间,比如time.sleep(1)让程序运行到这里的时候暂停1秒。适时地暂停可以缓解服务器的压力,也可以保护自己的硬盘,正好码久了睡个觉,或者去趟gym,结果就出来了。
+ N& }9 U( w/ ?

4 ^; v7 B  N/ y" j' E9 V
作者: 活宝小净    时间: 2015-12-6 19:18
66666,mark~~~~~~~4 E7 A/ H+ [; p, [; M- j; s6 {( `

作者: 孤星亘    时间: 2016-1-26 09:57
好帖,感谢楼主的分享~! C4 d: ~. N2 ?# W0 D  I' `- Z( M





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5