Python爬虫教程知识点总结


Posted in Python onOctober 19, 2020

一、为什么使用Python进行网络爬虫?

由于Python语言十分简洁,使用起来又非常简单、易学,通过Python 进行编写就像使用英语进行写作一样。另外Python 在使用中十分方便,并不需要IDE,而仅仅通过sublime text 就能够对大部分的中小应用进行开发;除此之外Python 爬虫的框架功能十分强大,它的框架能够对网络数据进行爬取,还能对结构性的数据进行提取,经常用在数据的挖掘、历史数据的存储和信息的处理等程序内;Python网络的支持库和html的解析器功能十分强大,借助网络的支持库通过较少代码的编写,就能够进行网页的下载,且通过网页的解析库就能够对网页内各标签进行解析,和正则的表达式进行结合,

十分便于进行网页内容的抓取。所以Python在网络爬虫网面有很大的优势。

二、判断网站数据是否支持爬取

几乎每个网站都有一个名为 robots.txt 的文档,当然也有部分网站没有设定robots.txt。如果网站没有设定 robots.txt 就可以通过网络爬虫获取没有口令加密的数据,也就是这个网站所有页面数据都可以爬取。当然如果网站有 robots.txt 文档,就要判断是否有禁止访客获取的数据。

以淘宝网为例,在浏览器中访问 https://www.taobao.com/robots.txt,如图所示。

Python爬虫教程知识点总结

上图淘宝网的robots.txt文件内容

淘宝网允许部分爬虫访问它的部分路径,而对于没有得到允许的用户,则全部禁止爬取,代码如下:

User-Agent:*
Disallow:/
12

这一句代码的意思是除前面指定的爬虫外,不允许其他爬虫爬取任何数据。

三、requests 库抓取网站数据

1.如何安装 requests 库

1.首先在 PyCharm 中安装 requests 库

2.打开 PyCharm,单击“File”(文件)菜单

3.选择“Setting for New Projects…”命令

Python爬虫教程知识点总结

4.选择“Project Interpreter”(项目编译器)命令

5.确认当前选择的编译器,然后单击右上角的加号。

Python爬虫教程知识点总结

6.在搜索框输入:requests(注意,一定要输入完整,不然容易出错),然后单击左下角的“Install Package”(安装库)按钮。

Python爬虫教程知识点总结

安装完成后,会在 Install Package 上显示“Package‘requests' installed successfully”(库的请求已成功安装),如果安装不成功将会显示提示信息。

Python爬虫教程知识点总结

四、爬虫的基本原理

网页请求的过程分为两个环节:

  1. Request (请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。

  2. Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,就是我们所熟悉的网页请求

Python爬虫教程知识点总结

网页请求的方式也分为两种:

  1. GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。

  2. POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。

所以,在写爬虫前要先确定向谁发送请求,用什么方式发送。

五、使用 GET 方式抓取数据

复制任意一条首页首条新闻的标题,在源码页面按【Ctrl+F】组合键调出搜索框,将标题粘贴在搜索框中,然后按【Enter】键。

标题可以在源码中搜索到,请求对象是www.cntour.cn,请求方式是GET(所有在源码中的数据请求方式都是GET),如图 9所示。

Python爬虫教程知识点总结

确定好请求对象和方式后,在 PyCharm 中输入以下代码:

import requests    #导入requests包
url = 'http://www.cntour.cn/'
strhtml = requests.get(url)    #Get方式获取网页数据
print(strhtml.text)
1234

Python爬虫教程知识点总结

加载库使用的语句是 import+库的名字。在上述过程中,加载 requests 库的语句是:import requests。

用 GET 方式获取数据需要调用 requests 库中的 get 方法,使用方法是在 requests 后输入英文点号,如下所示:

requests.get
1

将获取到的数据存到 strhtml 变量中,代码如下:

strhtml = request.get(url)
1

这个时候 strhtml 是一个 URL 对象,它代表整个网页,但此时只需要网页中的源码,下面的语句表示网页源码:

strhtml.text
1

六、使用 POST 方式抓取数据

首先输入有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。

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

Python爬虫教程知识点总结

在有道翻译中输入“我爱中国”,单击“翻译”按钮

Python爬虫教程知识点总结

在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据

Python爬虫教程知识点总结

单击 Headers,发现请求数据的方式为 POST。

Python爬虫教程知识点总结

找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。

首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下:

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
1

POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。

Form Data 中的请求参数如图

Python爬虫教程知识点总结

将其复制并构建一个新字典:

From_data={'i':'我?壑??,'from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt':'15477056211258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'1547705621125','bv':'b33a2f3f9d09bde064c9275bcb33d94e','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'}
1

将字符串格式的数据转换成 JSON 格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下:

import json
content = json.loads(response.text)
print(content['translateResult'][0][0]['tgt'])
123

使用 requests.post 方法抓取有道翻译结果的完整代码如下:

import requests    #导入requests包
import json
def get_translate_date(word=None):
  url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
  From_data={'i':word,'from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt':'15477056211258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'1547705621125','bv':'b33a2f3f9d09bde064c9275bcb33d94e','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'}
  #请求表单数据
  response = requests.post(url,data=From_data)
  #将Json格式字符串转字典
  content = json.loads(response.text)
  print(content)
  #打印翻译后的数据
  #print(content['translateResult'][0][0]['tgt'])
if __name__=='__main__':
  get_translate_date('我爱中国')
1234567891011121314

七、使用 Beautiful Soup 解析网页

通过 requests 库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。

安装 bs4 库的方式如图 所示:

Python爬虫教程知识点总结

安装好 bs4 库以后,还需安装 lxml 库。如果我们不安装 lxml 库,就会使用 Python 默认的解析器。尽管 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此笔者推荐安装 lxml 库。

安装 Python 第三方库后,输入下面的代码,即可开启 Beautiful Soup 之旅:

import requests    #导入requests包
from bs4 import  BeautifulSoup
url='http://www.cntour.cn/'
strhtml=requests.get(url)
soup=BeautifulSoup(strhtml.text,'lxml')
data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')
print(data)
1234567

代码运行结果如图。

Python爬虫教程知识点总结

Beautiful Soup 库能够轻松解析网页信息,它被集成在 bs4 库中,需要时可以从 bs4 库中调用。其表达语句如下:

from bs4 import BeautifulSoup
1

首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中,代码如下:

soup=BeautifulSoup(strhtml.text,'lxml')
1

接下来用 select(选择器)定位数据,定位数据时需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令

Python爬虫教程知识点总结

随后在浏览器右侧会弹出开发者界面,右侧高亮的代码(参见图 19(b))对应着左侧高亮的数据文本(参见图 19(a))。右击右侧高亮数据,在弹出的快捷菜单中选择“Copy”➔“Copy Selector”命令,便可以自动复制路径。

Python爬虫教程知识点总结

将路径粘贴在文档中,代码如下:

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a
1

由于这条路径是选中的第一条的路径,而我们需要获取所有的头条新闻,因此将 li:nth-child(1)中冒号(包含冒号)后面的部分删掉,代码如下:

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a
1

使用 soup.select 引用这个路径,代码如下:

data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
1

八、清洗和组织数据

至此,获得了一段目标的 HTML 代码,但还没有把数据提取出来,接下来在 PyCharm 中输入以下代码:纯文本复制

for item in data:
  result={
    'title':item.get_text(),
    'link':item.get('href')
  }
print(result)
123456

代码运行结果如图 所示:

Python爬虫教程知识点总结

首先明确要提取的数据是标题和链接,标题在<a>标签中,提取标签的正文用 get_text() 方法。链接在<a>标签的 href 属性中,提取标签中的 href 属性用 get() 方法,在括号中指定要提取的属性数据,即 get('href')。

从图 20 中可以发现,文章的链接中有一个数字 ID。下面用正则表达式提取这个 ID。需要使用的正则符号如下:\d匹配数字+匹配前一个字符1次或多次

在 Python 中调用正则表达式时使用 re 库,这个库不用安装,可以直接调用。在 PyCharm 中输入以下代码:

import re
for item in data:
  result={
    "title":item.get_text(),
    "link":item.get('href'),
    'ID':re.findall('\d+',item.get('href'))
  }
print(result)
12345678

运行结果如图 所示:

Python爬虫教程知识点总结

这里使用 re 库的 findall 方法,第一个参数表示正则表达式,第二个参数表示要提取的文本。

九.爬虫攻防战

爬虫是模拟人的浏览访问行为,进行数据的批量抓取。当抓取的数据量逐渐增大时,会给被访问的服务器造成很大的压力,甚至有可能崩溃。换句话就是说,服务器是不喜欢有人抓取自己的数据的。那么,网站方面就会针对这些爬虫者,采取一些反爬策略。

服务器第一种识别爬虫的方式就是通过检查连接的 useragent 来识别到底是浏览器访问,还是代码访问的。如果是代码访问的话,访问量增大时,服务器会直接封掉来访 IP。

那么应对这种初级的反爬机制,我们应该采取何种举措?

还是以前面创建好的爬虫为例。在进行访问时,我们在开发者环境下不仅可以找到 URL、Form Data,还可以在 Request headers 中构造浏览器的请求头,封装自己。服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent,如图:

Python爬虫教程知识点总结

因此,我们只需要构造这个请求头的参数。创建请求头部信息即可,代码如下:

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
response = request.get(url,headers=headers)
12

写到这里,很多读者会认为修改 User-Agent 很太简单。确实很简单,但是正常人1秒看一个图,而个爬虫1秒可以抓取好多张图,比如 1 秒抓取上百张图,那么服务器的压力必然会增大。也就是说,如果在一个 IP 下批量访问下载图片,这个行为不符合正常人类的行为,肯定要被封 IP。

其原理也很简单,就是统计每个IP的访问频率,该频率超过阈值,就会返回一个验证码,如果真的是用户访问的话,用户就会填写,然后继续访问,如果是代码访问的话,就会被封 IP。

这个问题的解决方案有两个,第一个就是常用的增设延时,每 3 秒钟抓取一次,代码如下:

import time
time.sleep(3)
12

但是,我们写爬虫的目的是为了高效批量抓取数据,这里设置 3 秒钟抓取一次,效率未免太低。其实,还有一个更重要的解决办法,那就是从本质上解决问题。

不管如何访问,服务器的目的就是查出哪些为代码访问,然后封锁 IP。解决办法:为避免被封 IP,在数据采集时经常会使用代理。当然,requests 也有相应的 proxies 属性。

到此这篇关于Python爬虫教程知识点总结的文章就介绍到这了,更多相关Python爬虫教程分享内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
django启动uwsgi报错的解决方法
Apr 08 Python
python发送邮件脚本
May 22 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
python的数学算法函数及公式用法
Nov 18 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 #Python
如何利用python读取micaps文件详解
Oct 18 #Python
Python中Yield的基本用法
Oct 18 #Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 #Python
Python通过format函数格式化显示值
Oct 17 #Python
Python如何使用vars返回对象的属性列表
Oct 17 #Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 #Python
You might like
PHP初学者头疼问题总结
2006/10/09 PHP
MYSQL数据库初学者使用指南
2006/11/16 PHP
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
js实现随机8位验证码
2020/07/24 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
Python Django使用forms来实现评论功能
2016/08/17 Python
django ajax json的实例代码
2018/05/29 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
绝对经典成功的大学生推荐信
2013/11/08 职场文书
文史专业毕业生自荐信
2013/11/17 职场文书
聚美优品励志广告词
2014/03/14 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
林肯就职演讲稿
2014/05/19 职场文书
校庆标语集锦
2014/06/25 职场文书
烈士陵园观后感
2015/06/08 职场文书
学生病假条范文
2015/08/17 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
Python Numpy库的超详细教程
2022/04/06 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python