来自 威尼斯国际官方网站 2019-11-28 04:53 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

爬取糗百,数据抓取

本文指标

  • 支配爬虫的基本概念
  • Requests 及 Beautiful Soup 多少个 Python 库的着力接收
  • 因而上述文化实现糗百段子抓取

Lxml

Lxml是基于libxml2那风流倜傥XML深入解析库的Python封装。该模块使用C语言编写,剖析速度比Beautiful Soup越来越快,不过安装进程也更头眼昏花。最新的装置表达能够参照http://Lxml.de/installation.html。
和Beautiful Soup同样,使用lxml模块的首先步也是将有望违规的HTML拆解剖判为统后生可畏格式。上面是运用该模块分析同叁个破损的HTML的事例。

>>> import lxml.html
>>> broken html = ’<ul class=country><li>Area<li>Population</ul>’
>>> tree = lxml.html.fromstring(broken_ html) #parse the HTML
>>> fixed html = lxml.html.tostring( tree , pretty_print=True )
>>> print(fixed_html)
<ul class=”country">
  <li>Area</li>
  <li>Population</li>
</ul>

风华正茂律地,lxml也足以准确解析属性两侧缺点和失误的引号,并关闭标签,可是该模块未有额外增加<html>和<body>标签。
深入分析完输入内容之后,进入选择成分的步调,那时lxml有三种不一样的主意,比方XPath选拔器和近似Beautiful Soup的find()方法。可是,在本例和后续示例中,我们将会使用CSS选取器,因为它进一层简明,并且能够在拆解解析动态内容时能够复用。此外,一些兼有jQuery选取器相关经验的读者也会对其进一层熟谙。
下边是运用lxml的CSS选拔器收取面积多少的身体力行代码。

import urllib.request
import lxml.html

def scrape(html):
    html = html.decode('utf-8')
    tree = lxml.html.fromstring(html)
    td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
    area = td.text_content()
    return area

if __name__ == '__main__':
    html = urllib.request.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
    print(scrape(html))

CSS选用器首荐会找到ID为places_area__row的报表行成分,然后接收class为w2p_fw的表格数据子标签。
亟需在乎的是,lxml在里头得以完成中,实际上是将CSS接纳器调换为等价的X帕特h选取器。

若是您的爬虫瓶颈时下载网页,并非收取数据的话,那么使用相当的慢的点子(如Beautiful Soup卡塔尔国也小难点。假使只需抓取少许数目,况兼想要幸免信赖的话,那么正则表明式只怕越来越相符。可是,经常状态下,lxml是抓取数据的最佳采用,那是因为该措施即高速又结实,而正则表明式和Beautiful Soup只在默写特定情景下有用。

Requests 库基本介绍

Requests 是读书爬虫的一大利器。是叁个雅淡轻易的 HTTP库。官方网站介绍如下:

Requests: HTTP for Humans

特意为人类利用的 HTTP 库。使用起来特别老妪能解。
大家一贯浏览网页的步调是输入网站,展开。在 Requests 中是之类那样的,大家得以在 Python 人机联作式解释器中输入以下代码:

import requests
r = requests.get('https://www.qiushibaike.com/text/') # 打开网址,一般我们会设置 请求头,来更逼真的模拟浏览器,下文有介绍
r.text

图片 1
小编门见到下边一批的代码,其实就是网页的源代码(也足以在浏览器上右键查看页面源代码)。通过这几行代码我们就获得了页面的具备新闻,剩下的正是从页面中找到大家所急需的新闻。

Beautiful Soup

Beautiful Soup是可怜流行的Python模块。该模块能够解析网页,并提供定位内容的简便接口。假诺你还尚未安装模块,能够运用上面包车型客车吩咐安装其风靡版本:pip install beautifulsoup4
利用Beautiful Soup的率先步是将已下载的HTML内容分析为soup文书档案。由于非常多网页都不辜负有优异的HTML格式,因而Beautiful Soup需求对其实际格式举办规定。比如,在上边那么些轻便网页的列表中,存在属性值两边引号缺点和失误和标签未密封的主题素材。

<ul class=country>
        <li>Area
        <li>Population
</ul>

黄金年代经Population列表项被解析为Area列表项的子成分,而不是仁同一视的七个列表项的话,我们在抓取时就能够拿到错误的结果。下边让我们看一下Beautiful Soup 是如何管理的。

>>> from bs4 import BeautifulSoup
>>> broken html = ’ <ul class = country> <li>Area<li>Population</ul> ’
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html , ’ html.parser’)
>>> fixed html = soup.prettify( )
>>> print(fixed_html)
<html>
  <body>
    <ul class = ” country ”>
      <li>Area</li>
      <li>Population</li>
    </ul>
  </body>
</html>

从地点的施行结果中能够看出,Beautiful Soup能够科学深入剖析缺点和失误的指导关闭合标签,别的还加多了<html><body>标签使其改为完全的HTML文档。以后能够运用find()和find_all()方法来定位大家供给的因素了。

>>> ul = soup.find('ul', sttrs=('class', 'country'))
>>> ul.find('li') # returns just the first match
<li>Area</li>
>>> ul.find_all('li') # returns all matches
[<li>Area</li>, <li>Population</li>]

上边是应用该格局抽出示例国家面积多少的完好代码

import urllib.request
from bs4 import BeautifulSoup

def scrape(html):
    soup = BeautifulSoup(html, "lxml")
    tr = soup.find(attrs={'id': 'places_area__row'}) # 找到区域行
    # 'class'是一个特殊的Python属性,所以使用‘class_’替换
    td = tr.find(attrs={'class':'w2p_fw'}) # 找到区域标签
    area = td.text # 从该标签提取区域内容
    return area

if __name__ == '__main__':
    html = urllib.request.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
    print(scrape(html))

输出为244,820 square kilometres

糗百爬虫代码

我们先爬取纯文本的内容 爬取这些链接下的内容。大家把页面布局截图如下,大家要得到的音信,笔者用革命的方框进行了标记。
图一:
图片 2
图二:
图片 3

import requests
from bs4 import BeautifulSoup


def download_page(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
    r = requests.get(url, headers=headers)  # 增加headers, 模拟浏览器
    return r.text


def get_content(html, page):
    output = """第{}页 作者:{} 性别:{} 年龄:{} 点赞:{} 评论:{}n{}n------------n""" # 最终输出格式
    soup = BeautifulSoup(html, 'html.parser')
    con = soup.find(id='content-left')  # 如图一红色方框
    con_list = con.find_all('div', class_="article")  # 找到文章列表
    for i in con_list:
        author = i.find('h2').string  # 获取作者名字
        content = i.find('div', class_='content').find('span').get_text()  # 获取内容
        stats = i.find('div', class_='stats')
        vote = stats.find('span', class_='stats-vote').find('i', class_='number').string
        comment = stats.find('span', class_='stats-comments').find('i', class_='number').string
        author_info = i.find('div', class_='articleGender')  # 获取作者 年龄,性别
        if author_info is not None:  # 非匿名用户
            class_list = author_info['class']
            if "womenIcon" in class_list:
                gender = '女'
            elif "manIcon" in class_list:
                gender = '男'
            else:
                gender = ''
            age = author_info.string   # 获取年龄
        else:  # 匿名用户
            gender = ''
            age = ''

        save_txt(output.format(page, author, gender, age, vote, comment, content))


def save_txt(*args):
    for i in args:
        with open('qiubai.txt', 'a', encoding='utf-8') as f:
            f.write(i)


def main():
    # 我们点击下面链接,在页面下方可以看到共有13页,可以构造如下 url,
    # 当然我们最好是用 Beautiful Soup找到页面底部有多少页。
    for i in range(1, 14):
        url = 'https://qiushibaike.com/text/page/{}'.format(i)
        html = download_page(url)
        get_content(html, i)

if __name__ == '__main__':
    main()

运作代码后,大家会获得 'qiubai.txt'文件,张开后如下所示
图片 4

剖判网页

想要驾驭二个网页的结果什么,能够使用查看源代码的措施。在抢先六分之三浏览器中,都得以在页面上右键单击采纳View page source选项,获取网页的源代码。
我们能够在HTML的代码中找到大家感兴趣的数目。

爬虫基本概念

爬虫也称网页蜘蛛,首要用以抓取网页上的特定音讯。那在咱们需求得到一些音讯时丰盛有用,比如大家能够批量到美图网址下载图片,批量下载段子。省去手工业操作的大方日子。爬虫程序日常是透过模拟浏览器对相应U智跑L发出伏乞,获取数据,并由此正则等手腕相配出页面中大家所需的数目。

在求学爬虫此前,最佳到 w3school 去精晓一下 HTML 标签的概念以致大旨的 CSS 的定义。那会让大家更便于的知情什么拿到页面中某些内容。

正则表明式

假诺您对正则表明式还不领悟,或是须求有些晋升时,能够查阅https://docs.python.org/2/howto/regex.html获取完整介绍。
下例为正则抓取国土面积

import urllib.request
import re
def scrape(html):
    html = html.decode('utf-8')
    area = re.findall('<tr id="places_area__row">.*?<tds*class=["']w2p_fw["']>(.*?)</td>', html)[0]
    return areahtml.decode('utf-8')

if __name__ == '__main__':
    html = urllib.request.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
    print(scrape(html))

得到结果244,820 square kilometres
正则表明式为大家提供了抓取数据的快速方式,不过该方法过去软弱,轻易在网页更新前面世难题。

本文由威尼斯国际官方网站发布于威尼斯国际官方网站,转载请注明出处:爬取糗百,数据抓取

关键词: