谷歌抓取网页视频教程(如何上手视编程基础而定?(一)(图))
优采云 发布时间: 2021-09-29 16:13谷歌抓取网页视频教程(如何上手视编程基础而定?(一)(图))
**前言:** 数据科学越来越流行,网页是一个巨大的数据来源。最近,很多人问如何抓取网页数据。据我所知,常见的编程语言(C++、java、python)都可以实现网页数据的抓取,甚至很多统计\计算语言(R、Matlab)都可以实现和网站交互包。尝试过用java、python、R来抓取网页,感觉语法不一样,逻辑是一样的。我打算用python讲一下网页爬虫的概念。具体内容还得看说明书或者google别人的博客。这是一个好主意。水平有限,有错误或者有更好的方法,欢迎讨论。**步骤 1:熟悉 Python 的基本语法。
**。更多信息
如果您已经熟悉 Python,请跳至第二步。
Python是一门比较容易上手的编程语言,如何上手取决于编程的基础。(1)如果你有一定的编程基础,建议看google的python课,链接这是一个为期两天的短期培训课程(当然是两天一整天),大约7个视频,每个视频后为编程作业,每个作业一个小时内可以完成。这是我学习python的第二课(第一门是codecademy上的python,很久以前看过,很多内容记不清了),我天天看视频+编程作业一个多小时,六天做完,效果还不错,python写基本程序没有问题。
(2)如果你没有任何编程基础,我建议你看看莱斯大学在coursera上开的An Introduction to Interactive Programming in Python。我没有关注过这门课程,但是coursetalk上的评论反映的很嗯。也有同学在评论(点这里),课程链接:Udacity上的.CS101也是不错的选择,地上有相关的讨论帖(点这里),这门课叫做build a search engine,里面会专门讲一些网络相关的模块。
其他学习资源包括代码学校和代码学院。这些资源也不错,但是编程量太少,初学者要系统的跟上课,多练习,打好基础。当然,每个人的喜好不同,我推荐的不一定适合你。你可以看看这个帖子【长期红利帖】介绍你上过的公开课
其他人在里面说什么,或者看看课程评论并决定。
第二步:学习如何与网站建立链接,获取网页数据。
编写脚本与网站进行交互,你必须熟悉python和网页相关的几个模块(urllib、urllib2、httplib)之一,知道一个,其他类似。这三个是python提供的与网页交互的基本模块,还有其他的,比如:mechanize和scrapy,我没用过,可能性能更好,欢迎学习补充。对于基本的网络爬虫,前三个模块就足够了。下面的代码演示了如何使用urllib2与Google Scholar交互获取网页信息。
导入模块 urllib2
导入 urllib2
随意查询 文章,例如 On random graph。每个查询googlescholar都有一个url,这个url形成的规则需要自己分析。
查询 ='On+random+graph'。来自:/bbs
网址 ='#x27; + 查询 +'&btnG=&as_sdt=1%2C5&as_sdtp='
设置头文件。爬取一些网页不需要专门设置头文件,但是如果你不在这里设置,谷歌会认为机器人无法访问它。另外,一些网站被访问并设置了cookies。这个比较复杂,这里暂时不提。关于如何知道头文件怎么写,有的插件可以看到你的浏览器和网站交互的头文件(很多浏览器都内置了这种工具),我用的是firebug插件- 在 Firefox 中。
header = {'Host':'',
'用户代理':'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0 ',
'接受':'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',
'接受编码':'gzip,放气',
'连接':'保持活动'}
建立连接请求。这时候谷歌服务器将页面信息返回给变量con,该变量是一个对象
req = urllib2.Request(url, headers = header)
con = urllib2.urlopen(req)
在con对象上调用read()方法,返回html页面,即带有html标签的纯文本
doc = con.read()
关闭连接。就像读取文件后关闭文件一样,如果不关闭它,有时可以,但有时会出现问题。因此,作为一个遵纪守法的好公民,最好是关闭联系。
关闭()
复制上面的代码,将在googlescholar上查询On Random Graph的结果返回给变量doc,这和打开googlescholar搜索On Random Graph,然后右击页面保存一样。
步骤三、 解析网页
以上步骤获取网页信息,但收录html标签。你需要去掉这些标签,然后从html文本中整理出有用的信息。您需要解析网页。解析网页的方法:(1)正则表达式。正则表达式很有用。熟悉了可以节省很多时间。有时候清洗数据不需要写脚本或者查询数据库,直接使用正则表达式notepad++上的组合就用吧。学习正则表达式的建议:30分钟正则表达式介绍,链接:(2) BeautifulSoup模块。BeautifulSoup是一个非常强大的模块,可以将html文件解析为对象,这个对象是一棵树,我们都知道HTML文件是树形的,比如body -> table -> tbody -> tr,对于节点tbody,有很多 tr 子节点。BeautifulSoup 可以轻松获取特定节点,对于单个节点,也可以使用其兄弟节点。网上有很多相关的说明。此处不再赘述,只演示一个简单的代码:(3) 以上两种方法结合使用。
导入BeautifulSoup模块和re模块,re是python中的正则表达式模块
*敏*感*词*美汤
*敏*感*词*重新
生成一个soup对象,doc在第二步有提到
汤 = 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)
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]
这些是我正在分析引文网络的项目的代码。顺便说一下,我从googlescholar那里抓取了论文信息和引文列表信息,在访问了大约1900次后交给了google block,导致这个区的ip暂时无法登录googlescholar。
第 4 步:访问数据
最后抓取到数据后,只存储在内存中,必须保存后才能使用。(1) 最简单的将数据写入txt文件的方法可以用Python实现,代码如下:
打开文件 webdata.txt 并生成目标文件。该文件可能不存在。参数 a 表示添加它。还有其他参数,如'r'只能读不能写,'w'可以写但原创记录将被删除等。
file = open('webdata.txt','a')
line = paper_name + '#' + paper_author + '#' + paper_desc + '#' + citeTimes + '\n'
# 对象file的write方法将字符串line写入file中
file = file.write(line)-google 1point3acres
# 再一次的,做个随手关闭文件的好青年
file.close()
这样,从网页中抓取并解析出来的数据就存储在本地了。是不是很简单?(2)当然也可以直接连接数据库,而不是写入txt文件。python中的MySQLdb模块可以和MySQL数据库交互,直接将数据倒入数据库,并与MySQL数据库的逻辑类似于与网站服务器建立链接的逻辑,如果之前学过数据库,学习使用MySQLdb模块与数据库进行交互是很简单的;如果不是,必须用coursera[stanford]() 数据库介绍是在openEdX平台上设置的,用于系统学习,w3school作为参考或者作为手册使用。Python可以链接数据库的前提是数据库是打开,我用的是win7 + MySQL<
%可以用cmd开启数据库,启动命令是:
net start mysql55 [1point3acres.com/bbs](http://1point3acres.com/bbs)
%关闭命令是:
net stop mysql55
使用 MySQLdb 模块代码的示例:
# 导入 MySQLdb模块
import MySQLdb
# 和服务器建立链接,host是服务器ip,我的MySQL数据库搭建在本机,默认的是127.0.0.1,
# 用户、密码、数据库名称对应着照输就行了,默认的端口号是3306,charset是编码方式,
# 默认的是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])
cur.execute(sql)
# 与查询不同的是,执行完delete,insert,update这些语句后必须执行下面的命令才能成功更新数据库
conn.commit()
# 一如既往的,用完了之后记得关闭cursor,然后关闭链接
cur.close()
conn.close()
这样就实现了Python和数据库的交互。除了 MySQL 数据库,python 的 PyGreSQL 模块可以支持 postgreSQL 数据库,道理类似。另外,如果你的网页收录中文,设置编码格式会很麻烦。需要对服务器、Python、数据库和数据库接口使用相同的编码格式,以避免出现乱码。如果出现中文乱码问题,请相信你不是一个人!!去google吧,成千上万的人都遇到过这种问题。关于编码问题,附上我看到的一篇博文
:
后记:
上面介绍了抓取网页数据的方法。数据只是一小步。如何分析数据是大学的问题。欢迎讨论。以上有不清楚的地方,欢迎交流。
**请注意:
网站的*敏*感*词*爬取会给网站的服务器带来很大的压力。尽量选择服务器比较放松的时间(比如清晨)。网站很多,不要用一亩三分地作为实验。
Python的time模块的sleep()方法可以让程序暂停一段时间,比如time.sleep(1)让程序在这里运行时暂停1秒。及时暂停可以缓解给服务器压力,保护好自己。只要睡久了,或者去健身房,结果就出来了。**
更新:2014年2月15日,修改了几个打字错误;添加了相关课程链接;加入udacity CS101;添加了 MySQLdb 模块的介绍。2014 年 2 月 16 日,添加了指向介绍编码方法的博客文章的链接。