网络爬虫基础总结

757次阅读
没有评论

网络爬虫基础总结

这篇文章是对莫烦pyhton爬虫基础课进行一个总结,详细教程大家可以参考学习官网: https://morvanzhou.github.io/tutorials/data-manipulation/scraping/

网络爬虫

对于网络爬虫,我个人理解就是从网页爬取数据。那么要学习网络爬虫,你得弄清楚以下几个问题:(1)网页是什么?(2)数据在网页中怎么存储的?(3)如何爬取数据?让我们一起带着问题去开启爬虫学习之旅吧。

本课程的教学流程如下图所示,不过这些都是些基础知识。有了基础之后,你才能更加深入自学。
网络爬虫基础总结

1. 爬虫简介

爬虫的产物产物无处不在, 比如说搜索引擎 (Google, 百度), 他们能为你提供这么多搜索结果, 也都是因为它们爬了很多信息, 然后展示给你. 再来说一些商业爬虫, 比如爬爬淘宝的同类商品的价格信息, 好为自己的商品挑选合适的价格. 爬虫的用途很多很多, 如果你搞机器学习, 爬虫就是你获取数据的一种途径, 网上的信息成百上千, 只要你懂爬虫, 你都能轻松获取。

  • why? ,爬虫就是为了爬取所需数据为我所用;
  • 知其然,也要知其所以然,我们必须了解网页结构
  • 网页结构

    学习爬虫, 首先要懂的是网页. 支撑起各种光鲜亮丽的网页的不是别的, 全都是一些代码. 这种代码我们称之为 HTML, HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览器能将这种语言转换成我们用肉眼看到的网页. 所以 HTML 里面必定存在着很多规律, 我们的爬虫就能按照这样的规律来爬取你需要的信息.其实除了 HTML, 一同构建多彩/多功能网页的组件还有 CSS 和 JavaScript.

    网页的基本组成部分
    在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的形式, 或有不同的功能. 主体的 tag 分成两部分, header 和 body. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看到的网页中的. 这些信息大多数时候是给浏览器看, 或者是给搜索引擎的爬虫看.例如,莫烦爬虫测试1的网页代码就很好地展现了网页的节本结构,具体网页的HTML代码如下:
    网络爬虫基础总结
    用python登录网页
    对网页结构和 HTML 有了一些基本认识以后, 我们就能用 Python 来爬取这个网页的一些基本信息. 首先要做的, 是使用 Python 来登录这个网页, 并打印出这个网页 HTML 的 source code. 注意, 因为网页中存在中文, 为了正常显示中文, read() 完以后, 我们要对读出来的文字进行转换, decode() 成可以正常显示中文的形式.

    from urllib.request import urlopen # if has Chinese, apply decode() html = urlopen( "https://morvanzhou.github.io/static/scraping/basic-structure.html" ).read().decode('utf-8') print(html)

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

    <!DOCTYPE html> <html lang="cn"> <head> <meta charset="UTF-8"> <title>Scraping tutorial 1 | 莫烦Python</title> <link rel="icon" href="https://morvanzhou.github.io/static/img/description/tab_icon.png"> </head> <body> <h1>爬虫测试1</h1> <p> 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a> <a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试. </p>

    </body> </html>

    2.BeatufulSoup 解析网页

    Beautiful Soup 4.2.0 中文官网

    0.BeatufulSoup的介绍

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。 我们了解了网页 (html) 的基本构架, 知道了爬网页就是在这个构架中找到需要的信息. 那么找到需要的信息时, BeautifulSoup 就是一个找信息好帮手. 它能帮你又快有准地找到信息. 大大简化了使用难度。

    1.安装

    # Python 2+ pip install beautifulsoup4 # # Python 3+ pip3 install beautifulsoup4 ```python 在这里插入代码片

    2.1 简单使用

    `爬取基本网页,BeautifulSoup 使用起来非常简单, 我们先按常规读取网页。

    from bs4 import BeautifulSoup from urllib.request import urlopen

    # if has Chinese, apply decode() html = urlopen("https://morvanzhou.github.io/static/scraping/basic-structure.html").read().decode('utf-8') print(html

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

    和所有链接 .

    <!DOCTYPE html> <html lang="cn"> <head> <meta charset="UTF-8"> <title>Scraping tutorial 1 | 莫烦Python</title> <link rel="icon" href="https://morvanzhou.github.io/static/img/description/tab_icon.png"> </head> <body> <h1>爬虫测试1</h1> <p> 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a> <a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试. </p>

    </body> </html>

    读取其实很简单,直接soup.h1或soup.p,a链接就用soup.find_all(a).

    soup = BeautifulSoup(html, features='lxml') print(soup.h1)

    """ <h1>爬虫测试1</h1> """

    print('\n', soup.p)

    """ <p> 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a> <a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试. </p> """ """ <a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> """

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

    # ['https://morvanzhou.github.io/', 'https://morvanzhou.github.io/tutorials/scraping']

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

    2.2 BeautifulSoup 解析网页: CSS

    2.2.1 什么是 CSS

    其实CSS就是对页面进行渲染的,让页面更加好看,特别有“骨感”!下面就拿莫烦python网站举例子。
    网络爬虫基础总结
    上面是没有加CSS的网页,如果有CSS,网页就变得丰富多彩起来. 文字有了颜色, 字体, 位置也多样了, 图片也有规则了,如下图所示。
    网络爬虫基础总结
    所以, CSS 主要用途就是装饰你 “骨感” HTML 页面。

    2.2.1 CSS 的 Class

    网络爬虫必须掌握的一条CSS规则就是Class,CSS 在装饰每一个网页部件的时候, 都会给它一个名字. 而且一个类型的部件, 名字都可以一样.比如我们这个练习网页. 里面的字体/背景颜色, 字体大小, 都是由 CSS 来掌控的.
    网络爬虫基础总结
    而 CSS 的代码, 可能就会放在这个网页的<head>中. 我们先使用 Python 读取这个页面.

    from bs4 import BeautifulSoup from urllib.request import urlopen

    # if has Chinese, apply decode() html = urlopen("https://morvanzhou.github.io/static/scraping/list.html").read().decode('utf-8') print(html)

    在 <head>中, 你会发现有这样一些东西被放在 <style> 里面, 这些东西都是某些 class 的 CSS 代码. 比如 jan 就是一个 class. jan 这个类掌控了这个类型的背景颜色. 所以在 <ul class="jan"> 这里, 这个 ul 的背景颜色就是黄色的. 而如果是 month 这个类, 它们的字体颜色就是红色.

    <head> ... <style> .jan { backgroundcolor: yellow; } ... .month { color: red; } </style> </head>

    <body> ... <ul> <li class="month">一月</li> <ul class="jan"> <li>一月一号</li> <li>一月二号</li> <li>一月三号</li> </ul> ... </ul> </body>

    这样, 我们就知道, 有时候, 网页中, 这种 class 归类一些组件还是很有用的. 比如我就想找 jan 下面的这些<li>. 我就能通过寻找 class=“jan” 找到它们. BeautifulSoup 就能这么干.

    2.2.2 按 Class 匹配

    按 Class 匹配很简单. 比如我要找所有 class=month 的信息. 并打印出它们的 tag 内文字.

    soup = BeautifulSoup(html, features='lxml')

    # use class to narrow search month = soup.find_all('li', {"class": "month"}) for m in month: print(m.get_text())

    """ 一月 二月 三月 四月 五月 """

    或者找到 class=jan 的信息. 然后在 <ul>下面继续找<ul> 内部的 <li> 信息. 这样一层层嵌套的信息, 非常容易找到.

    jan = soup.find('ul', {"class": 'jan'}) d_jan = jan.find_all('li') # use jan as a parent for d in d_jan: print(d.get_text())

    """ 一月一号 一月二号 一月三号 """

    如果想要找到一些有着一定格式的信息, 比如使用正则表达来寻找相类似的信息, 我们在 BeautifulSoup 中也能嵌入正则表达式, 让 BeautifulSoup 更为强大. 怎么用, 我们就接着往下看啦.

    2.3 BeautifulSoup 解析网页: 正则表达

    正则表达式, 是处理文本信息的重要工具, 除了 Python, 在其他的程序语言中, 也有十分重要的地位. 如果将正则表达式 + BeautifulSoup, 岂不是完美中的完美, 哈哈. 我们今天就来看看, 在 BeautifulSoup 中如何使用正则表达式, 获取更有难度的信息.

    2.3.1 正则表达式

    正则表达式很厉害, 它能用简单的规则匹配到多样化的文本信息.

    2.3.2 正则匹配

    先得读取网页,导入正则模块re。

    from bs4 import BeautifulSoup from urllib.request import urlopen import re

    # if has Chinese, apply decode() html = urlopen("https://morvanzhou.github.io/static/scraping/table.html").read().decode('utf-8')

    我们发现, 如果是图片, 它们都藏在这样一个 tag 中:

    <td> <img src="https://morvanzhou.github.io/static/img/course_cover/tf.jpg"> </td>

    所以, 我们可以用 soup 将这些 <img> tag 全部找出来, 但是每一个 img 的链接(src)都可能不同. 或者每一个图片有的可能是 jpg 有的是 png, 如果我们只想挑选 jpg 形式的图片, 我们就可以用这样一个正则 r’.*?.jpg’ 来选取. 把正则的 compile 形式放到 BeautifulSoup 的功能中, 就能选到符合要求的图片链接了.

    soup = BeautifulSoup(html, features='lxml')

    img_links = soup.find_all("img", {"src": re.compile('.*?\.jpg')}) for link in img_links: print(link['src'])

    """ https://morvanzhou.github.io/static/img/course_cover/tf.jpg https://morvanzhou.github.io/static/img/course_cover/rl.jpg https://morvanzhou.github.io/static/img/course_cover/scraping.jpg """

    又或者我们发现, 我想选一些课程的链接, 而这些链接都有统一的形式, 就是开头都会有 https://morvan., 那我就将这个定为一个正则的规则, 让 BeautifulSoup 帮我找到符合这个规则的链接.

    course_links = soup.find_all('a', {'href': re.compile('https://morvan.*')}) for link in course_links: print(link['href'])

    """ https://morvanzhou.github.io/ https://morvanzhou.github.io/tutorials/scraping https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/ https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/ https://morvanzhou.github.io/tutorials/data-manipulation/scraping/ """

    接下来,给出一个实战小例子:爬百度百科

    3.更多请求/下载方式

    参考学习链接:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/3-01-requests/

    3.1 多功能的requests

    关于Requests模块的学习文档:中文官网

    3.1.1 获取网页的方式

    其实在加载网页的时候, 有几种类型, 而这几种类型就是你打开网页的关键. 最重要的类型 (method) 就是 get 和 post (当然还有其他的, 比如 head, delete).
    网络爬虫基础总结
    这样看来, 很多网页使用 get 就可以了, 比如 莫烦Python 里的所有页面, 都是只是 get 发送请求. 而 post, 我们则是给服务器发送个性化请求, 比如将你的账号密码传给服务器, 让它给你返回一个含有你个人信息的 HTML.

    从主动和被动的角度来说, post 中文是发送, 比较主动, 你控制了服务器返回的内容. 而 get 中文是取得, 是被动的, 你没有发送给服务器个性化的信息, 它不会根据你个性化的信息返回不一样的 HTML.

    3.1.2 安装requests

    Requests 是一个 Python 的外部模块, 我们需要手动安装它. 简单的方法, 在你的 terminal 或者是 cmd, 使用 pip 安装就好了.

    # python 2+ pip install requests

    # python 3+ pip3 install requests

    3.1.3 requests get 请求

    典型的搜索就是一个requests get请求。首先, 我们固定不动的网址部分是 http://www.baidu.com/s, ? 后面的东西都是一些参数 (parameters), 所以我们将这些 parameters 用 python 的字典代替, 然后传入 requests.get() 功能. 然后我们还能用 python (webbrowser模块) 打开一个你的默认浏览器, 观看你是否在百度的搜索页面.

    import requests import webbrowser param = {"wd": "莫烦Python"} # 搜索的信息 r = requests.get('http://www.baidu.com/s', params=param) print(r.url) webbrowser.open(r.url)

    # http://www.baidu.com/s?wd=%E8%8E%AB%E7%83%A6Python

    这时, python 会弹出一个浏览器界面, 然后你看到的, 就是 “莫烦Python” 的搜索结果了.

    3.1.4 requests post 请求

    post 又怎么用呢?其实就是提交信息给另外一个网页。我们有一个提交信息的窗口, 如果我提交上去这个信息, 那边的服务器会更加这个提交的信息返回出另一个网页. 这就是网页怎么样使用你 post 过去的信息了.
    网络爬虫基础总结

    3.1.5 上传图片

    传照片也是 post 的一种, 我们得将本地的照片文件传送到服务器.

    3.1.6 登录

    用 post 还有一个重要的, 就是模拟登录.

    3.1.7 使用Session登录

    不过每次都要传递 cookies 是很麻烦的, 好在 requests 有个很 handy 的功能, 那就是 Session. 在一次会话中, 我们的 cookies 信息都是相连通的, 它自动帮我们传递这些 cookies 信息. 这时我感叹, 程序员真会偷懒~ 哈哈.

    同样是执行上面的登录操作, 下面就是使用 session 的版本. 创建完一个 session 过后, 我们直接只用 session 来 post 和 get. 而且这次 get 的时候, 我们并没有传入 cookies. 但是实际上 session 内部就已经有了之前的 cookies 了.

    session = requests.Session() payload = {'username': 'Morvan', 'password': 'password'} r = session.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload) print(r.cookies.get_dict()) # {'username': 'Morvan', 'loggedin': '1'}

    r = session.get("http://pythonscraping.com/pages/cookies/profile.php") print(r.text)

    # Hey Morvan! Looks like you're still logged into the site!

    3.2 下载文件

    参考学习链接:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/3-02-download/

    3.3 小练习:下载美图

    参考学习链接:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/3-03-practice-download-image/

    4.加速你的爬虫

    主要通过多进程分式和异步加载Asyncio方式加速爬虫,参考学习链接:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/4-01-distributed-scraping/

    5.高级爬虫

    主要包括两个内容: 让 Selenium 控制你的浏览器帮你爬、高效ipipgo的 Scrapy 爬虫库。
    参考学习链接:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/5-01-selenium/

    6 Scrapy项目

    以当当商品爬虫为例,讲述一下Scrapy项目的搭建流程

    当当网商品爬虫实战 基础补充:XPath表达式

    XPath表达式与正则表达式简单对比: 1、XPath表达式效率或高一点 2、正则表达式功能会强大一点 3、一般来说,优先选择我XPath,但是XPath解决不了的问题我们就会选正则表达式去解决。

    创建项目的cmd命令如下: 1、打开cmd,进入创建放置项目的目录: C:\Users\xuefa> cd /d F:\Projects\Python\python3_spider\scrapy 2、开始创建项目 F:\Projects\Python\python3_spider\scrapy>scrapy startproject dangdang 3、创建爬虫文件 F:\Projects\Python\python3_spider\scrapy>cd dangdang F:\Projects\Python\python3_spider\scrapy\dangdang>scrapy genspider t basic dd dangdang.com 4、打开pycharm编写代码 (1)在items.py中定义你要爬取的东西 items.py的路径:F:\Projects\Python\python3_spider\scrapy\dangdang\dangdang\items.py

    (2)在爬虫文件dd.py中提取爬取信息,提交给pipeline # 提取信息 def parse(self, response): ....

    (3)在pipelines.py中处理数据 首先要在setting.py取消pipeline的注释,连接pymysql,写sql语句

    5、编写爬虫文件:dd.py dd.py的路径:F:\Projects\Python\python3_spider\scrapy\dangdang\dangdang\spiders 6、运行爬虫文件:scrapy crawl dd nolog F:\Projects\Python\python3_spider\scrapy\dangdang\dangdang>scrapy crawl dd nolog

    最后推荐一下,对于python学习的入门教程,大家可以看莫烦Python

    神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

    相关文章:

    版权声明:Python教程2022-10-24发表,共计10238字。
    新手QQ群:570568346,欢迎进群讨论 Python51学习