import requests#导入requests包from bs4 importBeautifulSoupurl='http://www.cntour.cn/'strhtml=requests.get(url)soup=BeautifulSoup(strhtml.text,'lxml')data = https://www.isolves.com/it/cxkf/yy/Python/2020-08-12/soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')print(data)
import requests#导入requests包from bs4 importBeautifulSoupurl='http://www.cntour.cn/'strhtml=requests.get(url)soup=BeautifulSoup(strhtml.text,'lxml')data = https://www.isolves.com/it/cxkf/yy/Python/2020-08-12/soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')print(data)
代码运行结果如图 14 所示 。
文章插图
图14
Beautiful Soup 库能够轻松解析网页信息,它被集成在 bs4 库中,需要时可以从 bs4 库中调用 。其表达语句如下:
from bs4 import BeautifulSoup
首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析 。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象 。这里将解析后的文档存储到新建的变量 soup 中,代码如下:
soup=BeautifulSoup(strhtml.text,'lxml')
接下来用 select(选择器)定位数据,定位数据时需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令,
随后在浏览器右侧会弹出开发者界面,右侧高亮的代码(参见图 15(b))对应着左侧高亮的数据文本(参见图 15(a)) 。右击右侧高亮数据,在弹出的快捷菜单中选择“Copy”?“Copy Selector”命令,便可以自动复制路径 。
文章插图
图15
图 15 复制路径将路径粘贴在文档中,代码如下:
#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a
由于这条路径是选中的第一条的路径,而我们需要获取所有的头条新闻,因此将 li:nth-child(1)中冒号(包含冒号)后面的部分删掉,代码如下:
#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a
使用 soup.select 引用这个路径,代码如下:
data = https://www.isolves.com/it/cxkf/yy/Python/2020-08-12/soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
爬虫攻防战爬虫是模拟人的浏览访问行为,进行数据的批量抓取 。当抓取的数据量逐渐增大时,会给被访问的服务器造成很大的压力,甚至有可能崩溃 。换句话就是说,服务器是不喜欢有人抓取自己的数据的 。那么,网站方面就会针对这些爬虫者,采取一些反爬策略 。
服务器第一种识别爬虫的方式就是通过检查连接的 useragent 来识别到底是浏览器访问,还是代码访问的 。如果是代码访问的话,访问量增大时,服务器会直接封掉来访 IP 。
那么应对这种初级的反爬机制,我们应该采取何种举措?
还是以前面创建好的爬虫为例 。在进行访问时,我们在开发者环境下不仅可以找到 URL、Form Data,还可以在 Request headers 中构造浏览器的请求头,封装自己 。服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent,如图16所示 。
文章插图
因此,我们只需要构造这个请求头的参数 。创建请求头部信息即可,代码如下:
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)
写到这里,很多读者会认为修改 User-Agent 很太简单 。确实很简单,但是正常人1秒看一个图,而个爬虫1秒可以抓取好多张图,比如 1 秒抓取上百张图,那么服务器的压力必然会增大 。也就是说,如果在一个 IP 下批量访问下载图片,这个行为不符合正常人类的行为,肯定要被封 IP 。
其原理也很简单,就是统计每个IP的访问频率,该频率超过阈值,就会返回一个验证码,如果真的是用户访问的话,用户就会填写,然后继续访问,如果是代码访问的话,就会被封 IP 。
这个问题的解决方案有两个,第一个就是常用的增设延时,每 3 秒钟抓取一次,代码如下:
import timetime.sleep(3)
但是,我们写爬虫的目的是为了高效批量抓取数据,这里设置 3 秒钟抓取一次,效率未免太低 。其实,还有一个更重要的解决办法,那就是从本质上解决问题 。
推荐阅读
- 秦国灭赵国之战 秦灭赵国用了几年
- 10条很棒的Python一行代码
- rtsp协议之基本介绍
- 涿鹿之战还是涿鹿之战
- 断袖之癖指的是哪个皇帝
- 记忆中的经典,恋旧饼之韵饼茶泡饼
- 深圳旅游景点大全之景点介绍
- |玩了和田玉之后,虽然没有身价暴涨,但其令我博学多识
- 君子之道茶之艺术,普洱茶之陈化之香
- Python数据分析之初识可视化