Python爬虫入门,快速抓取大规模数据(第二部分)

通过第一部分的练习,我们已经有了一个可运行的爬虫。这一部分我们详细的看看如何使用BeautifulSoup从网页中提取我们需要的数据,学习的目标是能够使用BeautifulSoup从网页中提取任意的数据。

HTML文档和CSS选择器

我们知道我们抓取回来的网页是由HTML和CSS构成,HTML文档对象模型(DOM)将HTML文档表达为树结构。而提取网页特定数据实际上就是按照指定的特征匹配文档树并读取数据内容。

<!DOCTYPE html>
<html>
  <head>
    <title>Python爬虫入门</title>
  </head>
  <body>
    <h1>内容简介</h>
    <p id="content_id">这篇文章会从零开始介绍...</p>
    <p class="content_class">我们已经有一个可运行的爬虫...</p>
  </body>
</html>

BeautifulSoup支持大部分的CSS选择器,在tag或BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到tag。以上面的HTML为例,下面分别使用tag,tag+id, tag+class对网页元素定位:

>>> soup = BeautifulSoup(html, "html.parser")

>>> soup.select("body h1")
[<h1>内容简介</h1>]

>>> soup.select("p#content_id")
[<p id="content_id">这篇文章会从零开始介绍...</p>]

>>> soup.select("p.content_class")
[<p class="content_class">我们已经有一个可运行的爬虫...</p>]

爬虫实例

现在回到我们抓取豆瓣图书的例子,我们看看怎么使用BeautifulSoup从网页中提取书名,封面图片,图书简介等,代码如下。感兴趣的读者可以添加代码提取更多内容。

# 从BeautifulSoup对象中提取书名,封面图片和内容简介

def get_web_data(soup):

    try:
        # 提取书名
        elements = soup.select("div#wrapper h1 span")
        assert(len(elements) == 1)
        print(elements[0].text.strip())

        #提取图书的封面图片
        elements = soup.select("div#mainpic a.nbg img")
        assert(len(elements) == 1)
        print(elements[0]["src"])

        # 提取图书的内容简介
        elements = soup.select("div#link-report span.short div.intro")
        if (len(elements) == 1):
            print(elements[0].text.strip())
    except:
        print("ERROR: failed to get data")

提取数据的关键是分析并确定网页元素的CSS选择器。幸运的是浏览器可以帮我们很大的忙,以Chrome浏览器为例,在打开的网页上对想要提取的数据点击右键,在弹出的菜单项中选择检查元素。如图所示我们可以非常方便的得到元素对应的CSS选择器。
image

好,现在我们把数据提取部分代码加入我们的爬虫中。再次运行程序,图书书名,图书封面,简介信息便被提取和打印出来了。

if __name__== "__main__":

    while True:
        url = get_unvisited_url()
        if url == None:
            break

        print("\n\nGET " + url)

        # 抓取网页内容
        response = requests.get(url)
        content = response.content.decode("utf-8")
        #print(content)

        # 提取页面包含的数据
        soup = BeautifulSoup(content, "html.parser")                
        get_web_data(soup)

        # 获取页面包含的链接,并加入未访问的队列        
        for element in soup.select("a[href]"):

            new_url = element["href"].strip()            
            if re.match("^https://book.douban.com/subject/[0-9]+/$", new_url) == None:
                continue
            unvisited_urls.append(new_url)

        time.sleep(1)

总结

这一部分里我们详细介绍了如何提取网页数据。BeautifulSoup还有许多其它的API可以访问html的内容,细节可以参考BeautifulSoup文档。

在下一部分里我们将如何存储爬虫运行数据,以及抓取到的各种数据。

Source: https://www.toutiao.com/i6552304036127703560/

猜你喜欢

转载自blog.csdn.net/nj_kevin_peng/article/details/80288558