爬高爬山比赛活动方案以手为标准还是以脚为标准

查看: 105480|回复: 57
手把手教你用python抓网页数据
精华主题学分
在线时间 小时
购买链接:
注册一亩三分地论坛,查看更多干货!
才可以下载或查看,没有帐号?
本帖最后由 EroicaCMCS 于
20:29 编辑 . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
越来越火了,网页是数据很大的一个来源。最近很多人问怎么抓网页数据,据我所知,常见的编程语言(C++,java,python)都可以实现抓网页数据,甚至很多统计\计算的语言(R,Matlab)都有可以实现和网站交互的包。本人试过用java,python,R抓网页,感觉语法各有差异,逻辑上是一样的。我准备用python来大概讲讲抓网页是什么概念,具体的内容要自己看或者google别人的博客,这里算是抛砖引玉了。水平有限,出现错误或者有更好的办法,欢迎讨论。
步骤一:熟悉Python的基本语法。
已经熟悉Python的直接跳到步骤二。
Python是门比较容易入门的编程语言,如何上手视编程基础而定。
(1) 如果有一定编程的基础,建议看google's python class,链接
这个是一个为期两天的短期培训课程(当然,是两个全天),大概是七个视频,每个视频之后给编程作业,每个作业一个小时之内可以完成。这是我学习python的第二门课(第一门是codecademy的python,很早之前看的,很多内容都记不得了),当时每天看视频+编程作业一个多小时,六天弄完,效果还不错,用python写基本的程序没有问题。
(2) 如果是没有任何编程基础,建议看coursera上Rice University开的An Introduction to Interactive Programming in Python。这门课我没有跟过,但是看coursetalk的评论反映非常好,地里也有同学评论(),课程链接:。Udacity上的CS101也是不错的选择,地里有相关的讨论帖(),而且这门课就叫做build a search engine,会专门讲一些和网络相关的module。其他学习资源还有code school和codecademy,这些资源也是挺不错的,但是编程量太少,初学者还是系统的跟课、多练练手来打好基础吧。
当然,每个人的偏好不同,我推荐的不一定适合你。可以先看看这个帖子里面其他人是怎么说的,或者上看看课程评论,再决定吧。
步骤二:学会如何与网站建立链接,得到网页数据。
写脚本与网站进行交互,要熟悉python和网页相关的几个module(urllib,urllib2,httplib)中的一个,知道一个即可,其他的都类似的。这三个是python提供的和网页交互的基本module,还有其他的一些,比如:mechanize和scrappy,我没有用过,可能有更好的性能,欢迎了解的来补充。基本的网页抓取,前面的三个module足矣。
下面的代码演示如何用urllib2与google scholar进行交互,获得网页信息。
# 导入模块 urllib2
import urllib2
. 鍥磋鎴戜滑@1point 3 acres
# 随便查询一篇文章,比如On random graph。对每一个查询google
# scholar都有一个url,这个url形成的规则是要自己分析的。
query = 'On+random+graph'. Waral 鍗氬鏈夋洿澶氭枃绔,
url = '/scholar?hl=en&q=' + query + '&btnG=&as_sdt=1%2C5&as_sdtp='. from: /bbs
# 设置头文件。抓取有些的网页不需要专门设置头文件,但是这里如果不设置的话,
# google会认为是机器人不允许访问。另外访问有些网站还有设置Cookie,这个会相对复杂一些,
# 这里暂时不提。关于怎么知道头文件该怎么写,一些插件可以看到你用的浏览器和网站交互的
# 头文件(这种工具很多浏览器是自带的),我用的是firefox的firebug插件。
header = {'Host': '',. 鍥磋鎴戜滑@1point 3 acres
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/ Firefox/26.0',. Waral 鍗氬鏈夋洿澶氭枃绔,
'Accept': 'text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'}
# 建立连接请求,这时google的服务器返回页面信息给con这个变量,con是一个对象
req = urllib2.Request(url, headers = header) .
con = urllib2.urlopen( req )
# 对con这个对象调用read()方法,返回的是html页面,也就是有html标签的纯文本
doc = con.read()
# 关闭连接。就像读完文件要关闭文件一样,如果不关闭有时可以、但有时会有问题,
# 所以作为一个守法的好公民,还是关闭连接好了。.鏈枃鍘熷垱鑷1point3acres璁哄潧
con.close()复制代码以上的代码就把在google scholar上查询On Random Graph的结果返回到doc这个变量中了,这个和你打开google scholar搜索On Random Graph,然后将网页右键保存的效果是一样的。. Waral 鍗氬鏈夋洿澶氭枃绔,
步骤三、解析网页
上面的步骤得到了网页的信息,但是包括了html标签,你要把这些标签去掉,然后从html文本中整理出有用的信息,
你需要解析这个网页。
解析网页的方法:
(1) 正则表达式。正则表达式很有用,熟悉它节省很多的时间,有时候清洗数据不用写脚本或者在数据库上查询,直接在notepad++上用正则表达式组合使用就行了。如何学习正则表达式建议看:正则表达式30分钟入门教程,链接:
(2) BeautifulSoup模块。BeautifulSoup是一个很强大的模块,能把html文件解析成一个对象,这个对象是一棵树。我们都知道html文件是树状的,比如 body -& table -& tbody -& tr,对于tbody这个节点,有很多个tr的子节点。BeautifulSoup可以很方便的取到特定的节点,对单个节点也可以取它的sibling node。网上有很多相关的说明,这里不细说,只演示简单的代码:
(3) 上面两种方法结合使用。
# 导入BeautifulSoup模块和re模块,re是python中正则表达式的模块
import BeautifulSoup-google 1point3acres
# 生成一个soup对象,doc就是步骤二中提到的
soup = BeautifulSoup.BeautifulSoup(doc)
# 抓取论文标题,作者,简短描述,引用次数,版本数,引用它的文章列表的超链接
# 这里还用了一些正则表达式,不熟悉的先无知它好了。至于'class' : 'gs_rt'中
# 'gs_rt'是怎么来的,这个是分析html文件肉眼看出来的。上面提到的firebug插件
# 让这个变的很简单,只要一点网页,就可以知道对应的html 标签的位置和属性,.鐣欏璁哄潧-涓浜-涓夊垎鍦
# 相当好用。
paper_name = soup.html.body.find('h3', {'class' : 'gs_rt'}).text
paper_name = re.sub(r'\[.*\]', '', paper_name) # eliminate '[]' tags like '[PDF]'
paper_author = soup.html.body.find('div', {'class' : 'gs_a'}).text.
paper_desc = soup.html.body.find('div', {'class' : 'gs_rs'}).text
temp_str = soup.html.body.find('div', {'class' : 'gs_fl'}).text
temp_re = re.match(r'[A-Za-z\s]+(\d*)[A-Za-z\s]+(\d*)', temp_str)
citeTimes = temp_re.group(1). 1point 3acres 璁哄潧
versionNum = temp_re.group(2)
if citeTimes == '':
&&citeTimes = '0'
if versionNum == '':
&&versionNum = '0'
citedPaper_href = soup.html.body.find('div', {'class' : 'gs_fl'}).a.attrs[0][1]复制代码
这些都是我在一个分析citation network的项目的代码。顺便一提,我从google scholar上抓取paper的信息以及引用列表的信息,访问了大概1900次左右的时候给google block了,导致这个片区的ip一时无法登陆google scholar。
步骤四:存取数据
好不容易抓了数据,现在只是存储在内存中,必须保存起来才能利用。. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
(1) 最简单的方法之把数据写进txt文件中,Python中可以用如下代码实现:
.1point3acres缃
# 打开文件webdata.txt,生成对象file,这个文件可以是不存在的,参数a表示往里面添加。. Waral 鍗氬鏈夋洿澶氭枃绔,
# 还有别的参数,比如'r'只能读但不能写入,'w'可以写入但是会删除原来的记录等等. From 1point 3acres bbs
file = open('webdata.txt','a')
line = paper_name + '#' + paper_author + '#' + paper_desc + '#' + citeTimes + '\n'
# 对象file的write方法将字符串line写入file中
file = file.write(line)
# 再一次的,做个随手关闭文件的好青年
file.close()复制代码这样,就把从网页上抓到并且解析了的数据存储到本地了,是不是很简单?. 鍥磋鎴戜滑@1point 3 acres
(2) 当然,你也可以不写入txt文件中,而是直接连接数据库,python中的MySQLdb模块可以实现和MySQL数据库的交互,把数据直接倒到数据库里面,与MySQL数据库建立链接的逻辑和与网站服务器建立链接的逻辑差不多。如果之前有学习过数据库,学习用MySQLdb模块实现和数据库的交互是很简单的;如果没有,则要借助在coursera\ openEdX平台上都有开设的Introduction to Database来系统学习,w3school用来参考或者当成手册。
Python能够链接数据库的前提是数据库是开着的,我用的是 win7 + MySQL5.5,数据库在本地。
%可以用cmd开启数据库,启动命令是:
net start mysql55
%关闭命令是:
net stop mysql55复制代码使用MySQLdb模块代码示例:
# 导入 MySQLdb模块
import MySQLdb
# 和服务器建立链接,host是服务器ip,我的MySQL数据库搭建在本机,默认的是127.0.0.1,
# 用户、密码、数据库名称对应着照输就行了,默认的端口号是3306,charset是编码方式,. more info
# 默认的是utf8(也有可能是gbk,看安装的版本)。
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='yourPassword', db='dbname', port=3306, charset='utf8')
# 建立cursor
cur = conn.cursor()
# 通过对象cur的execute()方法执行SQL语句
cur.execute(&select * from citeRelation where paperName = 'On Random Graph'&)
# fetchall()方法获得查询结果,返回的是一个list,可以直接这样查询:list[i][j],
# i表示查询结果中的第i+1条record,j表示这条记录的第j+1个attribute(别忘了python从0开始计数)
list = cur.fetchall()
# 也可以进行delete,drop,insert,update等操作,比如:
sql = &update studentCourseRecord set fail = 1 where studentID = '%s' and semesterID = '%s' and courseID = '%s'& %(studentID,course[0],course[1]). /bbs
cur.execute(sql)
# 与查询不同的是,执行完delete,insert,update这些语句后必须执行下面的命令才能成功更新数据库 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
# 一如既往的,用完了之后记得关闭cursor,然后关闭链接
cur.close()
conn.close()复制代码
这样就实现了Python和数据库之间的交互。除了MySQL数据库外,python的PyGreSQL模块可以支持postgreSQL数据库,道理类似的。还有,如果你的网页里面包含了中文,设置编码格式会非常的麻烦,需要服务器、Python、数据库和数据库界面采用相同的编码格式才能不出现乱码,如果真的出现了中文乱码的问题,请相信,你不是一个人!!去google一下吧,成千上万的人碰到过这种问题。. Waral 鍗氬鏈夋洿澶氭枃绔,
关于编码的问题,附一篇我看到的博文&&:
.1point3acres缃
上面介绍了抓取网页数据的方法,抓取数据只是一小步,如何分析数据就是大学问了,欢迎讨论。
上面有什么地方讲不清楚的,欢迎交流。
大规模抓取网站会给网站的服务器带来很大的压力,尽量选择服务器相对轻松的时段(比如凌晨)。网站很多,不要拿一亩三分地来做试验。
Python的time模块的sleep()方法可以让程序暂停一段时间,比如time.sleep(1)让程序运行到这里的时候暂停1秒。适时地暂停可以缓解服务器的压力,也可以保护自己的硬盘,正好码久了睡个觉,或者去趟gym,结果就出来了。
日,更改了几处打字错误;添加了相关课程链接;增加了udacity CS101的介绍;增加了MySQLdb模块的介绍。. 鍥磋鎴戜滑@1point 3 acres
日,增加了介绍编码方式的博文链接。
. From 1point 3acres bbs
<p id="rate_501" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 1 升
" class="mtn mbn">
<p id="rate_252" onmouseover="showTip(this)" tip="欢迎来介绍你知道的情况&大米 + 25 升
" class="mtn mbn">
<p id="rate_687" onmouseover="showTip(this)" tip="超级玛丽好厉害!&大米 + 150 升
" class="mtn mbn">
<p id="rate_56" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 3 升
" class="mtn mbn">
<p id="rate_95" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 3 升
" class="mtn mbn">
<p id="rate_338" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 3 升
" class="mtn mbn">
<p id="rate_969" onmouseover="showTip(this)" tip="感谢分享!&大米 + 10 升
" class="mtn mbn">
<p id="rate_544" onmouseover="showTip(this)" tip="棒棒哒&大米 + 2 升
" class="mtn mbn">
<p id="rate_02" onmouseover="showTip(this)" tip="犀利!&大米 + 10 升
" class="mtn mbn">
<p id="rate_978" onmouseover="showTip(this)" tip="感谢分享!&大米 + 5 升
" class="mtn mbn">
<p id="rate_871" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 3 升
" class="mtn mbn">
<p id="rate_77" onmouseover="showTip(this)" tip="赞~&大米 + 3 升
" class="mtn mbn">
<p id="rate_98" onmouseover="showTip(this)" tip="高手&大米 + 100 升
" class="mtn mbn">
<p id="rate_78" onmouseover="showTip(this)" tip="好东西,学习了&大米 + 150 升
" class="mtn mbn">
<p id="rate_07" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
本帖被以下淘专辑推荐:
& |主题: 42, 订阅: 60
& |主题: 5, 订阅: 0
精华主题学分
农民代表, 积分 5812, 距离下一级还需 4188 积分
在线时间 小时
基本很详细了,抓抓普通的网页已经够用。
打算过段时间也写个抓网页的贴子,到时候问问你哈。
精华主题学分
在线时间 小时
能抓下来直接存到本地数据库么?
精华主题学分
在线时间 小时
再加个API 的和SQL的?
精华主题学分
在线时间 小时
好久没见你了,还以为你休假了呢。
细致的介绍,下次仔细看
精华主题学分
在线时间 小时
rsun 发表于
好久没见你了,还以为你休假了呢。. 鍥磋鎴戜滑@1point 3 acres
细致的介绍,下次仔细看
确实是回家“休假”了,其实我更情愿呆在学校“工作”.1point3acres缃
回家过年了就是时间各种零碎不好用. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
参加个ICM导致公开课落下一堆due。。。
精华主题学分
在线时间 小时
太谢谢啦!刚好需要从网页上抓数据最近!
精华主题学分
在线时间 小时
i mean access some APIs (make GET and POST requests etc). 1point 3acres 璁哄潧
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. 鍥磋鎴戜滑@1point 3 acres
这个问题如果能解决的话就更好了,感觉ipynb works more intuitively than knitr or rmd for reproducible research
精华主题学分
在线时间 小时
好赞! 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
以前class project用过weibo的API. From 1point 3acres bbs
从google scholar抓数据慎重。。。我就被禁过 T_T
鏉ユ簮涓浜.涓夊垎鍦拌鍧.
精华主题学分
在线时间 小时
做好准备!!!
精华主题学分
在线时间 小时
精华主题学分
在线时间 小时
好贴啊,刚好近期要用,楼主V5
精华主题学分
在线时间 小时
楼主有定时爬网页的经验么。。
如果要每天定时哪个时间跑下程序然后抓的数据放到一个file里。虽然我知道linux命令行,但是如果要定时每小时都跑一次,然后跑3个月,感觉自己笔记本一直开着不太现实呀。。有没有啥软件可以用啥的就是不用自己笔记本跑。。。付费也可以哇。
精华主题学分
在线时间 小时
本帖最后由 EroicaCMCS 于
16:33 编辑 . from: /bbs
xingzhui222 发表于
楼主有定时爬网页的经验么。。
如果要每天定时哪个时间跑下程序然后抓的数据放到一个file里。虽然我知道li ...-google 1point3acres
没有这方面的经验。。。. /bbs
肯定不能用笔记本啦,可以试一下免费的云平台,比如:sina app engine, google app engine
精华主题学分
在线时间 小时
FYI urllib is not thread safe.
精华主题学分
在线时间 小时
本帖最后由 ysyyork 于
19:18 编辑
抓网页抓了几个月。发现有的网站老变html代码格式。真是烦。。。
话说有个爬虫框架很好用介绍给大家Scrapy,虽然灵活性还是自己写的强,但是他的模板足以完成基本的爬取任务。有兴趣可以看看这个:
对于自动屏蔽ip的问题,你可以不要连着抓取,每次抓取完了用sleep函数睡眠一个random时间再抓,这样模拟浏览器访问,不容易被屏蔽。我之前爬豆瓣,连着怕60次就gg了,后来用sleep爬到150多次都没问题。再多应该也没问题,我没试过
<p id="rate_16" onmouseover="showTip(this)" tip="感谢分享!&大米 + 20 升
" class="mtn mbn">
精华主题学分
在线时间 小时
写得很好~刚好用得上~超级感谢~
精华主题学分
在线时间 小时
特别的,好赞!
精华主题学分
在线时间 小时
我在网上看了一个VBA的课程,目前才开始觉得很不错。应该学完VBA是可以试试这个程序的吧。打基础的过程开始了,纯文科背景的没有办法啊
精华主题学分
在线时间 小时
写的很好。简明扼要。Mining the Social Web不错
<form method="post" autocomplete="off" id="fastpostform" action="forum.php?mod=post&action=reply&fid=172&tid=83337&extra=&replysubmit=yes&infloat=yes&handlekey=fastpost"
onSubmit="
// TODO Howard 11/3/2015
var sbtn = $('fastpostsubmit');
sbtn.disabled =
sbtn.innerHTML = ' 回复发表中... ';
sbtn.setAttribute('background', sbtn.style.background);
sbtn.setAttribute('bordercolor', sbtn.style.borderColor);
sbtn.style.background = '#C7C7C7';
sbtn.style.borderColor = '#8B8B8B';
var form =
// --product--
var isValid = fastpostvalidate(form, null, 0);
if(!isValid) reoverBtn();
return isV
// --product--
// --testing--
//setTimeout(function() {
// var isValid = fastpostvalidate(form, null, 0);
// if(!isValid) reoverBtn();
//}, 2000);
// --testing--
您需要登录后才可以回帖
回帖并转播
回帖后跳转到最后一页
Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!
一亩三分地推荐 /5
地主Warald亲手做你的申请,针对你的背景和目标,考虑申请、学习、就业、移民等系列问题,制定申请策略。
“offer”指全额奖学金,免学费全免+每月工资,Berkeley, CMU, JHU, UIUC, Gatech, UMich, UCLA, Columbia,欢迎观赏。
电子工程、计算机、统计、金数金工、化工等, Stanford, Berkeley, CMU, Cornell, Yale, Columbia, Chicago, Duke, UPenn, UIUC, Brown, UMich, JHU等
有留学、申请、找工、职业规划上的难题?先上论坛提问!
论坛考古也帮不上忙,发帖得到的回答仍然不够?电话找Warald来解答!
WARALD新书上市啦:《你不知道的美国留学》清华大学出版社,各大电商发售
Powered by今日: 0|昨日: 0|帖子: 2069|会员: 390550|欢迎新会员:
主题: 37, 帖数: 37
主题: 39, 帖数: 39
主题: 8, 帖数: 9
主题: 4, 帖数: 4
主题: 32, 帖数: 33
主题: 3, 帖数: 3
主题: 19, 帖数: 43
主题: 8, 帖数: 759
主题: 2, 帖数: 114
主题: 2, 帖数: 107
主题: 7, 帖数: 373
主题: 7, 帖数: 510
主题: 10, 帖数: 23
主题: 15, 帖数: 15
- 总计 16 人在线
- 最高记录是 18029 于 .
Powered by
黑侠泛站群官方网站东方供应商
您好,欢迎光临东方供应商!  |  |  | &
市场动态新增加商机:397859
[最新] [最新] [最新] [最新] [最新] [最新] [最新] [最新] [最新]
22F|||||热门分类其它分类21F|||||热门分类其它分类1234567891020F|||||热门分类其它分类19F|||||热门分类其它分类18F|||||热门分类其它分类17F|||||热门分类其它分类16F|||||热门分类其它分类15F|||||热门分类其它分类14F|||||热门分类其它分类13F|||||热门分类其它分类1234512F|||||热门分类其它分类11F|||||热门分类其它分类10F|||||热门分类其它分类9F|||||热门分类其它分类8F|||||热门分类其它分类7F|||||热门分类其它分类123456F|||||热门分类其它分类5F|||||热门分类其它分类4F|||||热门分类其它分类3F|||||热门分类其它分类2F|||||热门分类其它分类1F|||||热门分类其它分类12345合作伙伴||||||||||||||||||||||||||||||||||||||||||||||||||| |
| 声明:依据国家《互联网管理规定》,本站禁止发布任何违反中华人民共和国法律、法规的内容。 46.8752016&  版权所有   

我要回帖

更多关于 爬山比赛 的文章

 

随机推荐