1、必备知识
1)HTML
HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的。
常用HTML标签如下:
<html>..</html> 表示标记中间的元素是网页
<body>..</body> 表示用户可见的内容
<div>..</div> 表示框架
<p>..</p> 表示段落
<li>..</li>表示列表
<img>..</img>表示图片
<h1>..</h1>表示标题
<a href="">..</a>表示超链接
一般网页主要是HTML、CSS、JavaScript组成。CSS表示样式,主要定义网页的样式,JavaScript一般都是在网页中实现网站的功能的,大多情况我们都是爬取都是JavaScript执行之前的页面,除非有些特殊情况,比如,我们爬取的元素是需要在JavaScript执行后渲染出来的。但这样情况比较少。我们主要了解HTML、CSS就可以。
2)Python
如果没有编程基础的同学,可以参考下面教程:
3)TCP/IP协议,HTTP协议
主要是HTTP协议,HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
例如,
上面是通过浏览器查看的Http协议的请求和响应。
查看的方法:
按快捷键 F12,进入开发者模式,单击 Network,此时内容为空,例如,
现在刷新浏览器或访问一个网址,就可以看到请求的列表,找一个点击一下就可以看到请求和响应的Header信息。
通过此方式我们可以看出网站是通过GET方式还是POST请求的。如图,
2、爬虫的基本流程
发送请求 > 获取响应内容 > 解析内容 > 保存数据
1)发起请求
通过HTTP库向目标站点发起请求(request
),请求可以包含额外的header等信息,等待服务器响应。
2)获取响应内容
如果服务器能正常响应,会得到一个Response,Response的内容则是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型。
3)解析内容
获取的向应内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。
4)保存数据
一般根据需要可以存为文本,也可以保存到数据库,或者保存特定格式的文件等。
3、Python爬虫的类型及优缺点
Python爬虫以爬取方法区分主要有3种,包括通过正则表达式、BeautifulSoup
或Lxml
进行爬取解析。优缺点如下表,
爬取方法 | 性 能 | 使用难度 | 安装难度 |
正则表达式 | 快 | 困难 | 简单(内置模块) |
BeautifulSoup | 慢 | 简单 | 简单 |
Lxml | 快 | 简单 | 相对困难 |
注意:当网页结构简单并且不想要安装库,使用正则表达式更为合适。当需要爬取数据量较少时,使用较慢的BeautifulSoup
也可以的。当数据量大时,需要追求效益时,Lxml
时最好选择。
4、使用requests 库请求网站获取内容
参考文档:
https://2.python-requests.org/zh_CN/latest/user/quickstart.html
Python使用requests、urllib2、httplib2、http.client执行Get和Post请求
1)安装requests
在PyCharm中,单击“File”(文件)菜单,选择“Setting for New Projects...”命令,如下图,
弹出的窗口中,选择“Project Interpreter”(项目编译器)命令,确认当前选择的编译器,然后单击右上角的加号,如下图,
在搜索框输入:requests,然后单击左下角的“Install Package”(安装库)按钮。如下图,
安装完成后,会在 Install Package 上显示“Package‘requests’ installed successfully”(库的请求已成功安装)。
2)执行GET请求
import requests
start_url = 'https://www.baidu.com'
#指定http协议信息,伪装成正常浏览器请求
headers = {"Host": "www.baidu.com",
"Referer": "https://www.baidu.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
# 自定义代理ip,此处的ip需要自行更换,只需要将ip和port按格式拼接即可,可以去网上免费代理中寻找:http://www.xicidaili.com/nn
#proxies = {"https": "https://127.0.0.1:1080", "http": "http://127.0.0.1:1080"}
response = requests.get(url=start_url, headers=headers, proxies=proxies)
print(response) # 返回值:<Response [200]>
3)执行POST请求
import requests
url = 'https://en.artprecium.com/catalogue/vente_309_more-than-unique-multiples-estampes/resultat'
#指定http协议信息,伪装成正常浏览器请求
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Cookie": "PHPSESSID=m2hbrvp548cg6v4ssp0l35kcj7; _ga=GA1.2.2052701472.1532920469; _gid=GA1.2.1351314954.1532920469; __atuvc=3%7C31; __atuvs=5b5e9a0418f6420c001",
"Host": "en.artprecium.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
}
# 构造form表单
data = {"IdEpoque": "",
"MotCle": "",
"Order": "",
"LotParPage": "All",
"IdTypologie": ""}
response = requests.post(url=url, data=data, headers=headers, timeout=10)
print(response) # 返回值:<Response [200]>
5、使用 Beautiful Soup 解析网页
通过 requests 库已经可以抓到网页源码,然后需要从源码中解析数据。Beautiful Soup 是 python 的一个库,可以通过它来解析HTML数据。
1)安装 beautifulsoup4
安装可以参考下面的文档,也可以通过上面方式在在PyCharm中,搜索bs4,然后安装。
参考文档:安装beautifulsoup4到Python3的方法(系统中默认使用的是Python2.7)
2)解析HTML
import bs4
import requests
response = requests.get("https://en.wikipedia.org/wiki/Mathematics")
if response is not None:
html = bs4.BeautifulSoup(response.text, 'html.parser')
title = html.select("#firstHeading")[0].text
paragraphs = html.select("p")
for para in paragraphs:
print (para.text)
# just grab the text up to contents as stated in question
intro = '\n'.join([ para.text for para in paragraphs[0:5]])
print (intro)
参考文档:Python3 BeautifulSoup安装及爬取网站网页示例代码
6、使用Lxml解析网页
我们还可以使用Lxml解析抓到网页源码,Lxml
是基于 libxml2解析库的Python封装。libxml2是使用C语言编写的,解析速度很好,不过安装起来稍微有点复杂。也可以通过上面方式在在PyCharm中,搜索Lxml
,然后安装。
from lxml import etree
source_html = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
html = etree.HTML(source_html)
print(html)
result = etree.tostring(html)#会对的html标签进行补全
print(result.decode("utf-8"))