【Python网络爬虫】Python维基百科网页抓取(BeautifulSoup+Urllib2)

来源:互联网 发布:ipad福利软件 编辑:程序博客网 时间:2024/06/01 08:37

文章列表:http://blog.csdn.net/kicilove/article/

    • 引言
    • 一从网上提取信息的方式
    • 二什么是网络爬取
    • 三网络抓取所需的库
    • 四基础知识 - 熟悉HTML标签
    • 五使用BeautifulSoup来抓取网页
      • 1Import necessary libraries
      • 2Use function prettify to look at nested structure of HTML page
      • 3Work with HTML tags
      • 4Find the right table
      • Extract the information to DataFrame
    • 六但是为什么我不能使用正则表达式呢
    • 总结

引言:

从网络提取数据的需求和重要性正在变得越来越迫切。 每隔几个星期,我都会发现自己需要从网络中提取数据。 例如,上周我们正在考虑创建一个关于互联网上可用的各种数据科学课程的热度和情绪指数。 这不仅需要找到新的课程,而且还要抓住网络的评论,然后在几个指标上进行总结!

一、从网上提取信息的方式

有几种方法可以从网络中提取信息。 使用API可能是从网站提取数据的最佳方式。 几乎所有像Twitter,Facebook,Google,Twitter,StackOverflow这样的大型网站都提供了API,可以以更加结构化的方式访问他们的数据。

可悲的是,不是所有的网站都提供了一个API。 有的是因为他们不希望读者以结构化的方式提取大量的信息,有的则由于缺乏技术知识而不提供API。 在这些情况下做什么?此时需要从网站来获取信息。

可能还有其他一些方法,如RSS提要,但它们的使用是有限的,因此我没有把它们包括在这里的讨论中。

二、什么是网络爬取?

网络爬取是一种从网站提取信息的计算机软件技术。 这种技术主要集中在将网络上的非结构化数据(HTML格式)转换为结构化数据(数据库或电子表格)。

您可以通过各种方式执行网络抓取,包括使用Google文档几乎所有的编程语言。 我更倾向于Python,因为它的易用性和丰富的eocsystem。 它有一个名为“BeautifulSoup”的库来协助这项工作。 在本文中,我将向您展示使用python编程学习网页抓取的最简单方法。

对于那些需要用非编程方式从网页中提取信息的人,你也可以看看import.io。 它提供了一个GUI驱动的界面来执行所有基本的网页抓取操作。

三、网络抓取所需的库

我们知道,python是一种开源的编程语言。 你可能会发现许多库来执行一个功能。 因此,有必要找到最好的使用库。 我更喜欢BeautifulSoup(python库),因为它很容易和直观。 准确地说,我将使用两个Python模块来抓取数据:

  • Urllib2:这是一个可用于获取URL的Python模块。 它定义了函数和类来帮助URL操作(基本和摘要式身份验证,重定向,cookie等)。
  • BeautifulSoup:这是一个从网页中提取信息的工具。 您可以使用它来提取表格,列表和段落,也可以使用过滤器从网页中提取信息。 在本文中,我们将使用最新版本的BeautifulSoup 4。

BeautifulSoup不会为我们提取网页。 这就是为什么,我使用urllib2与BeautifulSoup库结合使用。

除了BeautifulSoup之外,Python还有其他几个用于HTML抓取的:

  • mechanize
  • scrapemark
  • scrapy

四、基础知识 - 熟悉HTML(标签)

在执行网页抓取时,我们处理html标签。 因此,我们必须对它们有很好的了解。 如果您已经了解HTML的基本知识,则可以跳过本节。 以下是HTML的基本语法:

这里写图片描述

这个语法有如下详述的各种标签:

1。<!DOCTYPE html>:HTML文档必须以类型声明开始
2。HTML文档包含在<html></html>之间
3。HTML文档的可见部分在<body></body>之间
4。HTML标题用<h1><h6>标签定义
5。HTML段落是用<p>标签定义的

其他有用的HTML标签:

1。HTML链接用<a>标签定义,<ahref="http://www.test.com">这是test.com的链接</a>
2。HTML表格定义为<Table>,行定义为<tr>,复数行被划分为<td>中的数据

这里写图片描述

3。HTML列表以<ul>(无序)和<ol>(有序)开头。 列表中的每一项都以<li>开头

五、使用BeautifulSoup来抓取网页

从维基百科页面上抓取数据。 我们的最终目标是提取印度国家,工会领土首都的名单。 一些基本的细节,如建立,前资本和其他形式这个维基百科页面。 让我们来学习一下这个项目的步骤:

1、Import necessary libraries:

#import the library used to query a websiteimport urllib2
#specify the urlwiki = "https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"
#Query the website and return the html to the variable 'page'page = urllib2.urlopen(wiki)
#import the Beautiful soup functions to parse the data returned from the websitefrom bs4 import BeautifulSoup
#Parse the html in the 'page' variable, and store it in Beautiful Soup formatsoup = BeautifulSoup(page)

2、Use function “prettify” to look at nested structure of HTML page

这里写图片描述

3、Work with HTML tags

Asoup.<tag>: Return content between opening and closing tag including tag.

In[30]:soup.titleOut[30]:<title>List of state and union territory capitals in India - Wikipedia, the free encyclopedia</title>

Bsoup.<tag>.string: Return string within given tag

In [38]:soup.title.stringOut[38]:u'List of state and union territory capitals in India - Wikipedia, the free encyclopedia'

CFind all the links within page’s <a> tags::我们知道,我们可以使用标签<a>来标记链接。 所以,我们应该选择soup.a,它应该返回网页中可用的链接。

In [40]:soup.a Out[40]:<a id="top"></a>

以上,你可以看到,我们只有一个输出。 现在提取<a>中的所有链接,我们将使用“find_all()”

这里写图片描述

以上显示了所有链接,包括标题,链接和其他信息。 现在只显示链接,我们需要迭代每个标签,然后用get得到“href”返回链接。

这里写图片描述

4、Find the right table

由于我们正在寻找一张表来提取有关州首府的信息,所以我们应该首先确定正确的表格。 让我们编写命令来提取所有table标签中的信息。

all_tables=soup.find_all('table')

现在要确定正确的表格,我们将使用表格的属性“class”并使用它来过滤右边的表格。 在chrome中,可以通过右键点击所需的网页表格 - >检查元素 - >复制类名或者通过上述命令的输出查找右表的类名。

right_table=soup.find('table', class_='wikitable sortable plainrowheaders')right_table

这里写图片描述

5.Extract the information to DataFrame

在这里,我们需要迭代每一行(tr),然后将tr(td)的每个元素分配给一个变量并将其附加到列表中。 我们先来看看表格的HTML结构

这里写图片描述

在上面,你可以注意到<tr>的第二个元素在标签<th>而不是<td>中,所以我们需要注意这一点。 现在要访问每个元素的值,我们将使用每个元素的“find(text = True)”选项。 让我们看看代码:

#Generate listsA=[]B=[]C=[]D=[]E=[]F=[]G=[]for row in right_table.findAll("tr"):    cells = row.findAll('td')    states=row.findAll('th') #To store second column data    if len(cells)==6: #Only extract table body not heading        A.append(cells[0].find(text=True))        B.append(states[0].find(text=True))        C.append(cells[1].find(text=True))        D.append(cells[2].find(text=True))        E.append(cells[3].find(text=True))        F.append(cells[4].find(text=True))        G.append(cells[5].find(text=True))
#import pandas to convert list to data frameimport pandas as pddf=pd.DataFrame(A,columns=['Number'])df['State/UT']=Bdf['Admin_Capital']=Cdf['Legislative_Capital']=Ddf['Judiciary_Capital']=Edf['Year_Capital']=Fdf['Former_Capital']=Gdf

最后,得到数据:

这里写图片描述

六、但是,为什么我不能使用正则表达式呢?

现在,如果你知道正则表达式,你可能会认为你可以使用正则表达式来编写代码,它可以为你做同样的事情。 在我用BeautifulSoup和正则表达式做同样的事情的经验,我发现:

  • 用BeautifulSoup编写的代码通常比使用正则表达式编写的代码更稳健。 用正则表达式编写的代码需要随着页面的变化而改变。 即使BeautifulSoup需要在某些情况下,BeautifulSoup只是相对更好。
  • 正则表达式比BeautifulSoup快得多,在给出相同的结果时,通常是100倍速度。

所以,它归结为代码的速度和鲁棒性,在这里没有普遍的赢家。 如果你正在寻找的信息可以用简单的正则表达式语句来提取。 对于几乎任何复杂的工作,相较于正则表达式,我更推荐BeautifulSoup。

总结:

本文,我们使用Python“BeautifulSoup”和“urllib2”来研究web抓取方法。 我们也研究了HTML的基础知识,同时一步一步地执行网页抓取。 快用它来从网页收集数据吧!

文章列表:http://blog.csdn.net/kicilove/article/

阅读全文
0 0
原创粉丝点击