网络爬虫基础总结
这篇文章是对莫烦pyhton爬虫基础课进行一个总结,详细教程大家可以参考学习官网: https://morvanzhou.github.io/tutorials/data-manipulation/scraping/
网络爬虫
对于网络爬虫,我个人理解就是从网页爬取数据。那么要学习网络爬虫,你得弄清楚以下几个问题:(1)网页是什么?(2)数据在网页中怎么存储的?(3)如何爬取数据?让我们一起带着问题去开启爬虫学习之旅吧。
本课程的教学流程如下图所示,不过这些都是些基础知识。有了基础之后,你才能更加深入自学。
1. 爬虫简介
爬虫的产物产物无处不在, 比如说搜索引擎 (Google, 百度), 他们能为你提供这么多搜索结果, 也都是因为它们爬了很多信息, 然后展示给你. 再来说一些商业爬虫, 比如爬爬淘宝的同类商品的价格信息, 好为自己的商品挑选合适的价格. 爬虫的用途很多很多, 如果你搞机器学习, 爬虫就是你获取数据的一种途径, 网上的信息成百上千, 只要你懂爬虫, 你都能轻松获取。
网页结构
学习爬虫, 首先要懂的是网页. 支撑起各种光鲜亮丽的网页的不是别的, 全都是一些代码. 这种代码我们称之为 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 解析网页
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 { background–color: 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免费测试