网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。本文主要介绍Python 爬虫入门教程。

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

如果没有编程基础的同学,可以参考下面教程:

Python编程学习教程

3)TCP/IP协议,HTTP协议

主要是HTTP协议,HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

例如,

httpswwwcjavapycom

上面是通过浏览器查看的Http协议的请求和响应。

查看的方法:

按快捷键 F12,进入开发者模式,单击 Network,此时内容为空,例如,

httpswwwcjavapycom

现在刷新浏览器或访问一个网址,就可以看到请求的列表,找一个点击一下就可以看到请求和响应的Header信息。

通过此方式我们可以看出网站是通过GET方式还是POST请求的。如图,

httpswwwcjavapycom

2、爬虫的基本流程

发送请求 > 获取响应内容 > 解析内容 > 保存数据

1)发起请求

通过HTTP库向目标站点发起请求(request),请求可以包含额外的header等信息,等待服务器响应。

2)获取响应内容

如果服务器能正常响应,会得到一个Response,Response的内容则是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型。

3)解析内容

获取的向应内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。

4)保存数据

一般根据需要可以存为文本,也可以保存到数据库,或者保存特定格式的文件等。

3、Python爬虫的类型及优缺点

Python爬虫以爬取方法区分主要有3种,包括通过正则表达式、BeautifulSoupLxml进行爬取解析。优缺点如下表,

           爬取方法

           性    能

         使用难度

          安装难度

       正则表达式

                 快

               困难

       简单(内置模块)

     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...”命令,如下图,

httpswwwcjavapycom

弹出的窗口中,选择“Project Interpreter”(项目编译器)命令,确认当前选择的编译器,然后单击右上角的加号,如下图,

httpswwwcjavapycom

在搜索框输入:requests,然后单击左下角的“Install Package”(安装库)按钮。如下图,

httpswwwcjavapycom

安装完成后,会在 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"))

参考文档Python通过Lxml库解析网络爬虫抓取到的html

推荐文档