【网络安全带你练爬虫-100练】第5练:爬虫的翻页操作+错误情况过滤

目录

一、翻页分析:

二、代码逻辑

1、入口程序修改

2、page参数传入

三、完整代码

1、运行结果

2、错误分析:

3、缺陷代码:

4、完善逻辑:

5、完善代码:


(说在前面,任何逻辑都有很多方法实现,我们先从最笨的讲起)

(注:其中的cookie需要填自己的)

一、翻页分析:

通过对比第一页与第二页的URL来看是否有差别

可以发现通过参数pageNum=来控制页面

(第一页pageNum参数被省略,如果下一面没有数据了,也可能出错)



二、代码逻辑

1、入口程序修改

if __name__ == '__main__':with open('1.csv', 'a', encoding='utf-8', newline='') as f:csv_w = csv.writer(f)csv_w.writerow(('公司名', 'URL', '类型', '资金'))for page in range(1, 6):get_TYC_info(page)print(f'第{page}页已爬完')time.sleep(2)

(1)if __name__ == '__main__':
一个条件语句,判断当前模块是否直接被运行。当该模块直接执行时,以下代码块将被执行。


(2)with open('1.csv', 'a', encoding='utf-8', newline='') as f:
打开名为"1.csv"的文件,并赋值给变量f。使用'a'模式打开文件,表示以追加方式写入文件内容。encoding='utf-8'表示以UTF-8编码打开文件,newline=''表示在写入时不插入额外的换行符。


(3)csv_w = csv.writer(f)
创建一个CSV写入器对象,并将文件对象f传递给它。这样可以通过该写入器对象来操作CSV文件。


(4)csv_w.writerow(('公司名', 'URL', '类型', '资金'))
使用CSV写入器对象csv_w将一个包含四个元素的元组写入CSV文件。这个元组表示CSV文件的表头,即第一行的内容。


(5)for page in range(1, 6):
这是一个循环语句,从1循环到5,将每个循环中的值赋给变量page。


(6)get_TYC_info(page)
调用名为get_TYC_info的函数,并传递当前循环的值page作为参数。这个函数用于爬取TYC网站上的信息。


(7)print(f'第{page}页已爬完')
打印当前循环的值page,并显示"第X页已爬完"的消息。这是一个简单的提示,用于显示程序的进度。


(8)time.sleep(2)
程序暂停执行2秒钟。这是为了避免过快地请求网页导致被屏蔽或限制访问。

2、page参数传入

def get_TYC_info(page):TYC_url = f"https://www.tianyancha.com/search?key=&sessionNo=1688538554.71584711&base=hub&cacheCode=00420100V2020&city=wuhan&pageNum={page}"

1、将page参数传入进get_TYC_info()函数(页面的爬取函数)

2、f'URL……&pageNum={page}'

将URL中的page参数动态修改



三、完整代码

(代码在最后)

1、运行结果

(第1、2面都是可以爬的)

 第2面开始有报错

(这个错误问题我们来分析一下)

其实就是爬取的列表为空,导致的错误


2、错误分析:

看图说话错误原因:

是不是到我们报错的位置这,下一个企业就没了相关类型了,对吧

所以爬取到的列表为空,从而导致了不能继续执行爬取下一级---->所以报错


3、缺陷代码:

import time
import requests
from bs4 import BeautifulSoup
import csvdef get_TYC_info(page):TYC_url = f"https://www.tianyancha.com/search?key=&base=hub&city=wuhan&cacheCode=00420100V2020&sessionNo=1688108233.45545222&pageNum={page}"html = get_page(TYC_url)soup = BeautifulSoup(html, 'lxml')GS_list = soup.find('div', attrs={'class': 'index_list-wrap___axcs'})GS_items = GS_list.find_all('div', attrs={'class': 'index_search-box__7YVh6'})for item in GS_items:title = item.find('div', attrs={'class': 'index_name__qEdWi'}).a.span.textlink = item.a['href']company_type = item.find('div', attrs={'class': 'index_tag-list__wePh_'}).find_all('div', attrs={'class': 'index_tag-common__edIee'})type_texts = [element.text for element in company_type]money = item.find('div', attrs={'class': 'index_info-col__UVcZb index_narrow__QeZfV'}).span.textprint(title.strip(), link, type_texts, money)def get_page(url):try:headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/44.0.2403.89 Chrome/44.0.2403.89 Safari/537.36','Cookie':'!!!!!!!!!!'
}response = requests.get(url, headers=headers, timeout=10)return response.textexcept:return ""if __name__ == '__main__':with open('1.csv', 'a', encoding='utf-8', newline='') as f:csv_w = csv.writer(f)csv_w.writerow(('公司名', 'URL', '类型', '资金'))for page in range(1, 6):get_TYC_info(page)print(f'第{page}页已爬完')time.sleep(2)

4、完善逻辑:

加上了一个if判断,第一个爬取点不为none才继续往后

        if company_type_div is not None:company_type = company_type_div.find_all('div', attrs={'class': 'index_tag-common__edIee'})type_texts = [element.text for element in company_type]else:type_texts=''

运行结果:

指定的5面全部爬取完了


5、完善代码:

(注:其中的cookie需要填自己的)

import time
import requests
from bs4 import BeautifulSoup
import csvdef get_TYC_info(page):TYC_url = f"https://www.tianyancha.com/search?key=&sessionNo=1688538554.71584711&base=hub&cacheCode=00420100V2020&city=wuhan&pageNum={page}"html = get_page(TYC_url)soup = BeautifulSoup(html, 'lxml')GS_list = soup.find('div', attrs={'class': 'index_list-wrap___axcs'})GS_items = GS_list.find_all('div', attrs={'class': 'index_search-box__7YVh6'})for item in GS_items:title = item.find('div', attrs={'class': 'index_name__qEdWi'}).a.span.textlink = item.a['href']company_type_div = item.find('div', attrs={'class': 'index_tag-list__wePh_'})if company_type_div is not None:company_type = company_type_div.find_all('div', attrs={'class': 'index_tag-common__edIee'})type_texts = [element.text for element in company_type]else:type_texts=''money = item.find('div', attrs={'class': 'index_info-col__UVcZb index_narrow__QeZfV'}).span.textprint(title.strip(), link, type_texts, money)def get_page(url):try:headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/44.0.2403.89 Chrome/44.0.2403.89 Safari/537.36','Cookie':'!!!!!!!!!!'
}response = requests.get(url, headers=headers, timeout=10)return response.textexcept:return ""if __name__ == '__main__':with open('1.csv', 'a', encoding='utf-8', newline='') as f:csv_w = csv.writer(f)csv_w.writerow(('公司名', 'URL', '类型', '资金'))for page in range(1, 6):get_TYC_info(page)print(f'第{page}页已爬完')time.sleep(2)



网络安全小圈子

README.md · 书半生/网络安全知识体系-实战中心 - 码云 - 开源中国 (gitee.com)https://gitee.com/shubansheng/Treasure_knowledge/blob/master/README.md

GitHub - BLACKxZONE/Treasure_knowledgehttps://github.com/BLACKxZONE/Treasure_knowledge

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/12998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短视频抖音账号矩阵系统源码---功能架构示例1

一、短视频账号矩阵系统源码开发服务器集群化处理开发成本更低(前提) 什么是集群化处理视频内存内耗?集群化处理视频内存内耗是指通过建立集群系统,将视频处理任务分配给多个计算节点进行并行处理,以减少单个计算节点…

大数据开发环境-Hbase

1.启动之前需要确保hadoop启动 # 查看 Hadoop 是否已经正常启动 : start-all.sh jps 2.启动Hbase

【运维工程师学习三】Linux中Shell脚本编写

【运维工程师学习三】shell编程 Shell程序分类1、系统中sh命令是bash的软链接2、Shell脚本标准格式之文件后缀3、Shell脚本标准格式之文件内容首行4、Shell脚本的运行方法一、作为可执行程序解释 二、作为解释器(bash)参数 5、find、grep、xargs、sort、…

Python学习笔记(十八)————python包相关

目录 (1)python包作用 (2)自定义python包 (3)导入自定义包 方式一: 方式二: (4)导入第三方包 ①pip安装 ②PyCharm安装 (1)pytho…

抖音seo矩阵系统源代码分享--开发者

一、技术开发注意事项: 目录 一、技术开发注意事项: 二、抖音SEO账号矩阵系统源码思路 三、抖音SEO底层开发逻辑主要包括以下几个方面: 四、 功能规划 五、 代码开发展示 确定业务需求:在开发前,需要明确抖音矩阵…

ChatGPT落地场景探索-数据库与大模型

目录 openGauss介绍 openGauss介绍 数据库与大模型 openGauss介绍 大模型与数据库 大模型为数据库带来的机遇 大模型解决数据库问题的挑战 数据库为大模型带来的价值 大模型大模型的发展趋势 趋势产品:Chat2DB 简介 特性 生产应用:基…

为什么需要多语言并行机器翻译?

随着全球化的加速和不同语言之间的交流需求不断增长,多语言机器翻译(Multilingual Parallel Machine Translation)成为一个备受关注的领域。传统上,机器翻译系统主要集中于一对特定语言之间的翻译,但这种单一语言对的模…

MySQL索引介绍及底层数据结构B+树介绍

索引 1. 索引概述1.1 索引1.2 索引的优缺点1.2.1 优点1.2.2 缺点 2. InnoDB中的索引2.1 主键索引设计方案2.2 索引底层数据结构2.3 常见索引2.3.1 聚簇索引2.3.1.1 优点2.3.1.2 缺点 2.3.2 非聚簇索引2.3.3 联合索引 3. MyISAM中的索引3.1 MyISAM 与 InnoDB对比 1. 索引概述 1…

代码随想录算法训练营第十一天 | 二叉树系列2

二叉树系列2 101 对称二叉树二叉树很重要的一点:确定遍历顺序关于递归代码随想录的代码我的代码(理解后编写) 100 相同的树我的代码 572 另一个树的子树我的代码录友的代码,只用递归!!! 104 二叉树的最大深度重点代码随…

17.OpenCV中的GFTTDetector类

文章目录 GFTTDetector功能OpenCV中GFTTDetector类reference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 这是使用imgproc.hpp中的goodFeaturesToTrack函数封装的类,其使用和goodFeaturesToTrack函数基本相似。 GFTTDetec…

【算法与数据结构】20、LeetCode有效的括号

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:括号匹配是使用栈解决的经典问题。做这道题首先要分析什么时候括号不匹配。1、右括号多余 ( { [ ] } )…

PCL 法向量估计源码学习

一、思路&#xff1a; 二、源码 #ifndef PCL_FEATURES_IMPL_NORMAL_3D_H_ #define PCL_FEATURES_IMPL_NORMAL_3D_H_#include <pcl/features/normal_3d.h>/// template <typename PointInT, typename PointOutT> void pcl::NormalEstimation<PointInT, PointOutT…