查看: 217149| 回复: 78
跳转到指定楼层
上一主题 下一主题
收起左侧

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

   
全局:

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

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

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即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
以上的代码就把在google scholar上查询On Random Graph的结果返回到doc这个变量中了,这个和你打开google scholar搜索On Random Graph,然后将网页右键保存的效果是一样的。

步骤三、解析网页
上面的步骤得到了网页的信息,但是包括了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即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
这些都是我在一个分析citation network的项目的代码。顺便一提,我从google scholar上抓取paper的信息以及引用列表的信息,访问了大概1900次左右的时候给google block了,导致这个片区的ip一时无法登陆google scholar。. 1point 3 acres

步骤四:存取数据
好不容易抓了数据,现在只是存储在内存中,必须保存起来才能利用。
(1) 最简单的方法之把数据写进txt文件中,Python中可以用如下代码实现:
  1. # 打开文件webdata.txt,生成对象file,这个文件可以是不存在的,参数a表示往里面添加。
  2. # 还有别的参数,比如'r'只能读但不能写入,'w'可以写入但是会删除原来的记录等等
  3. file = open('webdata.txt','a')
  4. line = paper_name + '#' + paper_author + '#' + paper_desc + '#' + citeTimes + '\n'. 1point 3acres
  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即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

这样就实现了Python和数据库之间的交互。除了MySQL数据库外,python的PyGreSQL模块可以支持postgreSQL数据库,道理类似的。还有,如果你的网页里面包含了中文,设置编码格式会非常的麻烦,需要服务器、Python、数据库和数据库界面采用相同的编码格式才能不出现乱码,如果真的出现了中文乱码的问题,请相信,你不是一个人!!去google一下吧,成千上万的人碰到过这种问题。
关于编码的问题,附一篇我看到的博文
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

后记:
上面介绍了抓取网页数据的方法,抓取数据只是一小步,如何分析数据就是大学问了,欢迎讨论。
上面有什么地方讲不清楚的,欢迎交流。
.--
特别注意:. ----
大规模抓取网站会给网站的服务器带来很大的压力,尽量选择服务器相对轻松的时段(比如凌晨)。网站很多,不要拿一亩三分地来做试验。
Python的time模块的sleep()方法可以让程序暂停一段时间,比如time.sleep(1)让程序运行到这里的时候暂停1秒。适时地暂停可以缓解服务器的压力,也可以保护自己的硬盘,正好码久了睡个觉,或者去趟gym,结果就出来了。


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

.--

. 1point 3acres



评分

参与人数 33大米 +1367 收起 理由
pokeritney + 1 给你点个赞!
水莹莹 + 5 很有用的信息!
amplORMS + 10 很有用的信息!
Chalchie + 5 很有用的信息!
yuanyuang + 5 给你点个赞!

查看全部评分


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

本帖被以下淘专辑推荐:

推荐
goldin2008 2015-9-10 12:48:25 | 只看该作者
全局:
你好lz,我用了你的方法,但是为什么这个pdf文件没法抓下来呢?我用web browser都能打开和下载
谢谢你:)
  1. import urllib2

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


  6. def download_file(download_url, filename):

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

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

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

使用道具 举报

推荐
 楼主| EroicaCMCS 2014-11-5 02:16:44 | 只看该作者
全局:
pijefreskue 发表于 2014-10-28 22:16
你好,我想问一下我用Python得到网页的源代码之后,如何能知道我想要的代码是什么呢?比如我知道我想下图片 ...

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

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

使用道具 举报

推荐
 楼主| EroicaCMCS 2014-8-13 15:39:40 | 只看该作者
全局:
本帖最后由 EroicaCMCS 于 2014-8-13 15:41 编辑
oliverhao 发表于 2014-8-13 13:47
python 报错:
Traceback (most recent call last):
  File "D:/SQL/sea.py", line 16, in -toplevel-

是的,BeautifulSoup是外部模块,要自己安装。
.1point3acres
在linux下, 直接
. check 1point3acres for more.$ apt-get install python-beautifulsoup. Waral dи,

在windows下,先安装包管理工具,比如easy_install, 然后
$ easy_install BeautifulSoup
回复

使用道具 举报

🔗
nibuxing 2014-2-14 02:52:33 | 只看该作者
全局:
给力。. 1point3acres.com
基本很详细了,抓抓普通的网页已经够用。
打算过段时间也写个抓网页的贴子,到时候问问你哈。

点评

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

使用道具 举报

🔗
KikSamuel 2014-2-14 04:02:31 | 只看该作者
全局:
能抓下来直接存到本地数据库么?

点评

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

使用道具 举报

🔗
modifiedname 2014-2-14 04:13:26 | 只看该作者
全局:
赞!
再加个API 的和SQL的?

点评

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

使用道具 举报

🔗
jby1797 2014-2-14 08:07:43 | 只看该作者
全局:
好久没见你了,还以为你休假了呢。
细致的介绍,下次仔细看
回复

使用道具 举报

🔗
 楼主| EroicaCMCS 2014-2-15 01:30:07 | 只看该作者
全局:
rsun 发表于 2014-2-14 08:07
好久没见你了,还以为你休假了呢。.1point3acres
细致的介绍,下次仔细看

确实是回家“休假”了,其实我更情愿呆在学校“工作”
回家过年了就是时间各种零碎不好用
参加个ICM导致公开课落下一堆due。。。
回复

使用道具 举报

🔗
KikSamuel 2014-2-15 02:12:52 | 只看该作者
全局:
太谢谢啦!刚好需要从网页上抓数据最近!
回复

使用道具 举报

🔗
modifiedname 2014-2-15 02:16:22 | 只看该作者
全局:
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. check 1point3acres for more.
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 | 只看该作者
全局:
好赞!. ----

.. 以前class project用过weibo的API. Χ
. 1point 3acres
从google scholar抓数据慎重。。。我就被禁过 T_T

回复

使用道具 举报

🔗
vicholas 2014-2-17 11:19:52 | 只看该作者
全局:
做好准备!!!
回复

使用道具 举报

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

本版积分规则

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