网络爬虫中进行数据抓取

以下内容是《用python写网络爬虫》的读书笔记

一、安装firebug lite

firebug lite是一个用于在网站中查看调试html,css和javascript的有效工具。它现在可以安装在chrome和firefox浏览器上。chrome浏览器的安装教程firefox浏览器的安装教程。

二、三种页面抓取方式

(1)正则表达式

正则表达式是我们进行数据获取的最基本的方式,不了解正则表达式的,可以参看正则表达式的基本用法

我们可以先下载html数据,然后用正则表达式对html中的数据进行匹配。以下是一个简单的用法样例:

url = "http://www.cnblogs.com/xudong-bupt/p/3586889.html"
html = download(url)
list = re.findall('<div class="BlogStats">(.*?)</div>', html)
print list[0]

这个样例的作用是能够打印出html文件中第一个<div class = "BlogStats"></div>之间的内容。

用正则表达式来获取数据,优点是形式简单,缺点是很难获得健壮的正则表达式,当页面发生细微变化时,正则表达式可能就不起作用了。

(2)Beautiful Soup

在开始之前内,首先我们需要在python中安装beautifulsoup模块,我使用 pip install beautifulsoup4,来进行模块的安装。它的相关方法可查阅其官方文档

现在我们来执行一个小样例:

from bs4 import BeautifulSoup
from Chapter1.Background_Research import *
def tes_example():
    '''
    use a broken_html to test the beautiful soup
    :return:
    '''
    broken_html = "<url class=country><li>Area <li>Population</url>"
    # use beautiful soup to parse the broken_html
    soup = BeautifulSoup(broken_html, 'html.parser')
    fixed_html = soup.prettify()
    print fixed_html

def find_text(url, id_name):
    '''
    find the lable text which id is equal to id_name
    :param url: the url of the html
    :param id_name: locate the special id
    :return: the text between the special label
    '''
    html = download(url)
    soup = BeautifulSoup(html, "html.parser")
    tr = soup.find(attrs={'id': id_name})
    text = tr.text
    return text
text = find_text("http://www.cnpythoner.com/post/300.html", 'title')
print text

(3)Lxml

Lxml 是基于libxml2这个xml解析库的python封装。该模块使用c语言编写,解析速度比beautiful soup更快,不过安装教程也更为复杂,附上最新的安装说明

Lxml和beautiful soup相比有一个明显的优点就是它能够使用css选择器进行数据抽取。它已经能够实现大部分的css3属性,但是还有一部分是不支持的。具体可参看它的说明文档

下面是Lxml使用的一个小样例:

import lxml.html
from Chapter1.Background_Research import download

def test_lxml():
'''
use a broken_html to test the beautiful soup
:return:
'''
broken_html = "<url class="country"><li>Area <li>Population</url>"
# use beautiful soup to parse the broken_html
parse_html = lxml.html.fromstring(broken_html)
fixed_html = lxml.html.tostring(parse_html, pretty_print=True)
print fixed_html
test_lxml()

def find_text(url, id_name):
'''
it can get all text of label a under the div which id is id_name

:param url: given a url
:param id_name: define the special id name
:return: all text
'''
html = download(url)
tree_html = lxml.html.fromstring(html)
td = tree_html.cssselect('div#'+id_name+'> a')
values = []
for d in td:
values.append(d.text_content())
return values

values = find_text("http://www.cnpythoner.com/post/300.html", 'bdshare')
for value in values:
print value
原文地址:https://www.cnblogs.com/whatyouknow123/p/7725119.html