• request爬虫入门


    🌸request爬虫入门

    从网页的基本结构开始讲述, 慢慢使用一些简单的工具, 做一些简单的爬虫. 还会有一些小练习, 让你爬爬真正的互联网. 下载美图, 逛逛百度百科, 全网爬取等等. 当你懂得了爬虫的概念, 我们在深入一些, 谈谈如何加速你那和蠕虫(爬的慢)一样的爬虫, 把它升级为一只小飞虫(多进程,异步爬取). 当然这些内容都不会特别深入, 重点是把你带入门

    简单的网页结构

    在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的形式, 或有不同的功能. 主体的 tag 分成两部分, headerbody. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看到的网页中的. 这些信息大多数时候是给浏览器看, 或者是给搜索引擎的爬虫看

    <head>
        <meta charset="UTF-8">
        <title>云澈の博客</title>
        <link rel="icon" href="https://liudufu.github.io/">
    </head>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    HTML 的第二大块是 body, 这个部分才是你看到的网页信息. 网页中的 heading, 视频, 图片和文字等都存放在这里. 这里的

    tag 就是主标题, 我们看到呈现出来的效果就是大一号的文字.

    里面的文字就是一个段落. 里面都是一些链接. 所以很多情况, 东西都是放在这些 tag 中的.

    用 Python 登录网页

    好了, 对网页结构和 HTML 有了一些基本认识以后, 我们就能用 Python 来爬取这个网页的一些基本信息. 首先要做的, 是使用 Python 来登录这个网页, 并打印出这个网页 HTML 的 source code. 注意, 因为网页中存在中文, 为了正常显示中文, read() 完以后, 我们要对读出来的文字进行转换, decode() 成可以正常显示中文的形式.

    from urllib.request import urlopen
    
    # if has Chinese, apply decode()
    html = urlopen(
        "https://liudufu.github.io/"
    ).read().decode('utf-8')
    print(html)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们能够成功读取这个网页的所有信息了. 但我们还没有对网页的信息进行汇总和利用. 我们发现, 想要提取一些形式的信息, 合理的利用 tag 的名字十分重要.

    匹配网页内容

    这里我们使用 Python 的正则表达式 RegEx 进行匹配文字, 筛选信息的工作. 如果是初级的网页匹配, 我们使用正则完全就可以了, 高级一点或者比较繁琐的匹配, 我还是推荐使用 BeautifulSoup. 不急不急, 我知道你想偷懒, 我之后马上就会教 beautiful soup 了. 但是现在我们还是使用正则来做几个简单的例子, 让你熟悉一下套路.

    如果我们想用代码找到这个网页的 title, 我们就能这样写. 选好要使用的 tag 名称 </code>. 使用正则匹配.</p> <pre data-index="2" class="set-code-show prettyprint"><code class="prism language-python has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="token keyword">import</span> re res <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">r"<title>(.+?)", html) print("\nPage title is: ", res[0])

    • 1
    • 2
    • 3

    如果想要找到中间的那个段落

    , 我们使用下面方法, 因为这个段落在 HTML 中还夹杂着 tab, new line, 所以我们给一个 flags=re.DOTALL 来对这些 tab, new line 不敏感.

    res = re.findall(r"

    (.*?)

    "
    , html, flags=re.DOTALL) # re.DOTALL if multi line print("\nPage paragraph is: ", res[0])
    • 1
    • 2
    • 3
    • 4

    最后一个练习是找一找所有的链接, 这个比较有用, 有时候你想找到网页里的链接, 然后下载一些内容到电脑里, 就靠这样的途径

    res = re.findall(r'href="(.*?)"', html)
    print("\nAll links: ", res)
    
    • 1
    • 2

    BeautifulSoup基础

    我们总结一下爬网页的流程, 让你对 BeautifulSoup 有一个更好的定位.

    1. 选着要爬的网址 (url)
    2. 使用 python 登录上这个网址 (urlopen等)
    3. 读取网页信息 (read() 出来)
    4. 将读取的信息放入 BeautifulSoup
    5. 使用 BeautifulSoup 选取 tag 信息等 (代替正则表达式)

    初学的时候总是搞不懂这些包是干什么的, 现在你就能理解这个 BeautifulSoup 到底是干什么的了.

    BeautifulSoup 使用起来非常简单, 我们先按常规读取网页

    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    
    # if has Chinese, apply decode()
    html = urlopen("url").read().decode('utf-8')
    print(html)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    每张网页中, 都有两大块, 一个是 , 一个是 , 我们等会用 BeautifulSoup 来找到 body 中的段落

    和所有链接 .

    读取这个网页信息, 我们将要加载进 BeautifulSoup, 以 lxml 的这种形式加载. 除了 lxml, 其实还有很多形式的解析器, 不过大家都推荐使用 lxml 的形式. 然后 soup 里面就有着这个 HTML 的所有信息. 如果你要输出

    标题, 可以就直接 soup.h1.

    soup = BeautifulSoup(html, features='lxml')
    print(soup.h1)
    
    print('\n', soup.p)
    
    • 1
    • 2
    • 3
    • 4

    如果网页中有多个同样的 tag, 比如链接 , 我们可以使用 find_all() 来找到所有的选项. 因为我们真正的 link 不是在 中间 , 而是在 里面, 也可以看做是 的一个属性. 我们能用像 Python 字典的形式, 用 key 来读取 l["href"].

    all_href = soup.find_all('a')
    all_href = [l['href'] for l in all_href]
    print('\n', all_href)
    
    • 1
    • 2
    • 3

    懂得这些还是远远不够的, 真实情况往往比这些复杂. BeautifulSoup 还有很多其他的选择增强器. 接下来, 我们来了解一些 CSS 的概念, 用 BeautifulSoup 加上 CSS 来选择内容.

    CSS

    CSS 主要用途就是装饰你 骨感 HTML 页面. 如果将 HTML 比喻成没穿衣服的人, 那 CSS 就是五颜六色的衣服. 穿在人身上让人有了气质. CSS 的规则很多, 好在如果你只是需要爬网页, 你并不需要学习 CSS 的这些用法或规则, (如果你想, 你可以看到这里), 你只需要注意 CSS 的一条规则就能玩转爬虫了.

    CSS 的 Class

    这条规则就是 CSS 的 Class, CSS 在装饰每一个网页部件的时候, 都会给它一个名字. 而且一个类型的部件, 名字都可以一样. 比如每个网页 里面的字体/背景颜色, 字体大小, 都是由 CSS 来掌控的.

    而 CSS 的代码, 可能就会放在这个网页的 中. 我们先使用 Python 读取这个页面.

    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    
    # if has Chinese, apply decode()
    html = urlopen("URL").read().decode('utf-8')
    print(html)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    中, 你会发现有这样一些东西被放在