查看: 211258|回复: 78
收起左侧

手把手教你用python抓网页数据

    |只看干货
本楼: 👍   100% (16)
 
 
0% (0)   👎
全局: 👍   95% (1411)
 
 
4% (60)    👎

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
前言:
数据科学越来越火了,网页是数据很大的一个来源。最近很多人问怎么抓网页数据,据我所知,常见的编程语言(C++,java,python)都可以实现抓网页数据,甚至很多统计\计算的语言(R,Matlab)都有可以实现和网站交互的包。本人试过用java,python,R抓网页,感觉语法各有差异,逻辑上是一样的。我准备用python来大概讲讲抓网页是什么概念,具体的内容要自己看手册或者google别人的博客,这里算是抛砖引玉了。水平有限,出现错误或者有更好的办法,欢迎讨论。

步骤一:熟悉Python的基本语法。. ----
已经熟悉Python的直接跳到步骤二。
Python是门比较容易入门的编程语言,如何上手视编程基础而定。
(1) 如果有一定编程的基础,建议看google's python class,链接https://developers.google.com/edu/python/?hl=zh-CN&csw=1
这个是一个为期两天的短期培训课程(当然,是两个全天),大概是七个视频,每个视频之后给编程作业,每个作业一个小时之内可以完成。这是我学习python的第二门课(第一门是codecademy的python,很早之前看的,很多内容都记不得了),当时每天看视频+编程作业一个多小时,六天弄完,效果还不错,用python写基本的程序没有问题。
(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,这些资源也是挺不错的,但是编程量太少,初学者还是系统的跟课、多练练手来打好基础吧。
当然,每个人的偏好不同,我推荐的不一定适合你。可以先看看这个帖子【长期加分贴】介绍你上过的公开课里面其他人是怎么说的,或者上coursetalk.org看看课程评论,再决定吧。


步骤二:学会如何与网站建立链接,得到网页数据。
写脚本与网站进行交互,要熟悉python和网页相关的几个module(urllib,urllib2,httplib)中的一个,知道一个即可,其他的都类似的。这三个是python提供的和网页交互的基本module,还有其他的一些,比如:mechanize和scrappy,我没有用过,可能有更好的性能,欢迎了解的来补充。基本的网页抓取,前面的三个module足矣。
下面的代码演示如何用urllib2与google scholar进行交互,获得网页信息。
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
以上的代码就把在google scholar上查询On Random Graph的结果返回到doc这个变量中了,这个和你打开google scholar搜索On Random Graph,然后将网页右键保存的效果是一样的。
. 1point 3 acres
步骤三、解析网页-baidu 1point3acres
上面的步骤得到了网页的信息,但是包括了html标签,你要把这些标签去掉,然后从html文本中整理出有用的信息,
你需要解析这个网页。
解析网页的方法:
(1) 正则表达式。正则表达式很有用,熟悉它节省很多的时间,有时候清洗数据不用写脚本或者在数据库上查询,直接在notepad++上用正则表达式组合使用就行了。如何学习正则表达式建议看:正则表达式30分钟入门教程,链接:http://deerchao.net/tutorials/regex/regex.htm
(2) BeautifulSoup模块。BeautifulSoup是一个很强大的模块,能把html文件解析成一个对象,这个对象是一棵树。我们都知道html文件是树状的,比如 body -> table -> tbody -> tr,对于tbody这个节点,有很多个tr的子节点。BeautifulSoup可以很方便的取到特定的节点,对单个节点也可以取它的sibling node。网上有很多相关的说明,这里不细说,只演示简单的代码:.--
(3) 上面两种方法结合使用。
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
这些都是我在一个分析citation network的项目的代码。顺便一提,我从google scholar上抓取paper的信息以及引用列表的信息,访问了大概1900次左右的时候给google block了,导致这个片区的ip一时无法登陆google scholar。
. ----
步骤四:存取数据
好不容易抓了数据,现在只是存储在内存中,必须保存起来才能利用。
(1) 最简单的方法之把数据写进txt文件中,Python中可以用如下代码实现:
  1. # 打开文件webdata.txt,生成对象file,这个文件可以是不存在的,参数a表示往里面添加。
  2. # 还有别的参数,比如'r'只能读但不能写入,'w'可以写入但是会删除原来的记录等等. Waral dи,
  3. file = open('webdata.txt','a'). .и
  4. line = paper_name + '#' + paper_author + '#' + paper_desc + '#' + citeTimes + '\n'
  5. # 对象file的write方法将字符串line写入file中
  6. file = file.write(line)
  7. # 再一次的,做个随手关闭文件的好青年
  8. file.close()
复制代码
这样,就把从网页上抓到并且解析了的数据存储到本地了,是不是很简单?
(2) 当然,你也可以不写入txt文件中,而是直接连接数据库,python中的MySQLdb模块可以实现和MySQL数据库的交互,把数据直接倒到数据库里面,与MySQL数据库建立链接的逻辑和与网站服务器建立链接的逻辑差不多。如果之前有学习过数据库,学习用MySQLdb模块实现和数据库的交互是很简单的;如果没有,则要借助在coursera\Stanford openEdX平台上都有开设的Introduction to Database来系统学习,w3school用来参考或者当成手册。 ..
Python能够链接数据库的前提是数据库是开着的,我用的是 win7 + MySQL5.5,数据库在本地。
  1. %可以用cmd开启数据库,启动命令是:
  2. net start mysql55
  3. %关闭命令是:
  4. net stop mysql55
复制代码
使用MySQLdb模块代码示例:
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
..
这样就实现了Python和数据库之间的交互。除了MySQL数据库外,python的PyGreSQL模块可以支持postgreSQL数据库,道理类似的。还有,如果你的网页里面包含了中文,设置编码格式会非常的麻烦,需要服务器、Python、数据库和数据库界面采用相同的编码格式才能不出现乱码,如果真的出现了中文乱码的问题,请相信,你不是一个人!!去google一下吧,成千上万的人碰到过这种问题。
关于编码的问题,附一篇我看到的博文
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
. Χ
后记:
上面介绍了抓取网页数据的方法,抓取数据只是一小步,如何分析数据就是大学问了,欢迎讨论。.--
上面有什么地方讲不清楚的,欢迎交流。
. 1point3acres
特别注意:
大规模抓取网站会给网站的服务器带来很大的压力,尽量选择服务器相对轻松的时段(比如凌晨)。网站很多,不要拿一亩三分地来做试验。
Python的time模块的sleep()方法可以让程序暂停一段时间,比如time.sleep(1)让程序运行到这里的时候暂停1秒。适时地暂停可以缓解服务器的压力,也可以保护自己的硬盘,正好码久了睡个觉,或者去趟gym,结果就出来了。


更新:. .и
2014年2月15日,更改了几处打字错误;添加了相关课程链接;增加了udacity CS101的介绍;增加了MySQLdb模块的介绍。.--
2014年2月16日,增加了介绍编码方式的博文链接。. .и
.--

. check 1point3acres for more.




评分

参与人数 33大米 +1367 收起 理由
pokeritney + 1 给你点个赞!
水莹莹 + 5 很有用的信息!
amplORMS + 10 很有用的信息!
Chalchie + 5 很有用的信息!
yuanyuang + 5 给你点个赞!
ambition + 5
一木一亩 + 1 感谢分享!
hailie + 1 很有用的信息!

查看全部评分


上一篇:Quora topic network = zz
下一篇:Big Data Business & Data Scientist

本帖被以下淘专辑推荐:

goldin2008 2015-9-10 12:48:25 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (6)
 
 
0% (0)    👎
你好lz,我用了你的方法,但是为什么这个pdf文件没法抓下来呢?我用web browser都能打开和下载
谢谢你:)
  1. import urllib2


  2. def main():. Χ

  3.         download_file("https://dl.sciencesocieties.org/publications/aj/pdfs/107/5/1701?search-result=1", "test"). From 1point 3acres bbs

  4. ..
  5. def download_file(download_url, filename):

  6.         header = {'Host': 'dl.sciencesocieties.org',
  7. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0',
  8. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  9. 'Accept-Encoding': 'gzip, deflate',
  10. 'Connection': 'keep-alive'}.1point3acres

  11.         req = urllib2.Request(download_url, headers = header) #request
  12.         con = urllib2.urlopen( req ) #content
  13.         file = open(filename +".pdf", 'w')
  14.         file.write(con.read())
  15.         file.close(). 1point3acres.com
  16.         print("Completed")

  17. if __name__ == "__main__":
  18.     main()
复制代码
回复

使用道具 举报

 楼主| EroicaCMCS 2014-11-5 02:16:44 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   95% (1411)
 
 
4% (60)    👎
pijefreskue 发表于 2014-10-28 22:16
你好,我想问一下我用Python得到网页的源代码之后,如何能知道我想要的代码是什么呢?比如我知道我想下图片 ...

一般来说,网络上每一个东西都有一个URL(统一定位符)。不知道URL,可以用一些工具(比如: firebug)来找。

至于找到了然后不知道怎么获取,可以看这里:. 1point3acres.com
https://docs.python.org/2/howto/urllib2.html
回复

使用道具 举报

 楼主| EroicaCMCS 2014-8-13 15:39:40 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   95% (1411)
 
 
4% (60)    👎
本帖最后由 EroicaCMCS 于 2014-8-13 15:41 编辑 .--
oliverhao 发表于 2014-8-13 13:47 ..
python 报错:
Traceback (most recent call last):. 1point3acres.com
  File "D:/SQL/sea.py", line 16, in -toplevel-
.1point3acres
是的,BeautifulSoup是外部模块,要自己安装。

在linux下, 直接
$ apt-get install python-beautifulsoup.--
.--
在windows下,先安装包管理工具,比如easy_install, 然后
$ easy_install BeautifulSoup
回复

使用道具 举报

nibuxing 2014-2-14 02:52:33 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   98% (309)
 
 
1% (5)    👎
给力。.1point3acres
基本很详细了,抓抓普通的网页已经够用。
打算过段时间也写个抓网页的贴子,到时候问问你哈。

点评

好啊:)  发表于 2014-2-15 01:04
回复

使用道具 举报

KikSamuel 2014-2-14 04:02:31 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (62)
 
 
0% (0)    👎
能抓下来直接存到本地数据库么?

点评

可以,如何直接存到数据库的说明已经更新。  发表于 2014-2-15 01:05
回复

使用道具 举报

modifiedname 2014-2-14 04:13:26 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (13345)
 
 
5% (707)    👎
赞!
再加个API 的和SQL的?

点评

MySQLdb模块的介绍已经添加,其他的API 比如R的 在其他相关的帖子再介绍吧(努力学习中!!)  发表于 2014-2-15 01:26
回复

使用道具 举报

jby1797 2014-2-14 08:07:43 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   98% (1640)
 
 
1% (22)    👎
好久没见你了,还以为你休假了呢。
细致的介绍,下次仔细看
回复

使用道具 举报

 楼主| EroicaCMCS 2014-2-15 01:30:07 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   95% (1411)
 
 
4% (60)    👎
rsun 发表于 2014-2-14 08:07 . Χ
好久没见你了,还以为你休假了呢。
细致的介绍,下次仔细看
. Χ
确实是回家“休假”了,其实我更情愿呆在学校“工作”
回家过年了就是时间各种零碎不好用
参加个ICM导致公开课落下一堆due。。。. check 1point3acres for more.
回复

使用道具 举报

KikSamuel 2014-2-15 02:12:52 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (62)
 
 
0% (0)    👎
太谢谢啦!刚好需要从网页上抓数据最近!
回复

使用道具 举报

modifiedname 2014-2-15 02:16:22 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (13345)
 
 
5% (707)    👎
i mean access some APIs (make GET and POST requests etc)
e.g. scrape your weibo, twitter, douban data through API

between Py and R there's R2py or sth, but frankly I never got them to work seamlessly together
for ipynb there's sth that can make R results show up but always with an annoying blank
这个问题如果能解决的话就更好了,感觉ipynb works more intuitively than knitr or rmd for reproducible research
回复

使用道具 举报

duanmupeiyi 2014-2-15 03:12:53 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (2122)
 
 
0% (14)    👎
好赞!

以前class project用过weibo的API

从google scholar抓数据慎重。。。我就被禁过 T_T

回复

使用道具 举报

vicholas 2014-2-17 11:19:52 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   75% (3)
 
 
25% (1)    👎
做好准备!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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