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

news2024/11/23 21:01:50

目录

一、翻页分析:

二、代码逻辑

1、入口程序修改

2、page参数传入

三、完整代码

1、运行结果

2、错误分析:

3、缺陷代码:

4、完善逻辑:

5、完善代码:


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

一、翻页分析:

通过对比第一页与第二页的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 csv

def 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.text
        link = 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.text

        print(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'}
        response = requests.get(url, headers=headers, timeout=10)
        return response.text
    except:
        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、完善代码:

import time
import requests
from bs4 import BeautifulSoup
import csv

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}"
    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.text
        link = 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.text

        print(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'}
        response = requests.get(url, headers=headers, timeout=10)
        return response.text
    except:
        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)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python软件安装后,Scripts文件夹下为空解决办法

安装Python后,需要使用pip,发现Scripts下为空,无法install pip: 解决办法: cmd进入Windows命令提示符界面,进入Python的安装目录,并使用python -m ensurepip命令执行即可:

R语言——字符串处理

paste(abc, def, gh, sep ) #粘贴字符串 substr(abcdefg, 2, 3) # 取特定字符串 gsub(abc, , c(abc, abcc, abcbc)) # 将字符串中abc替换为空 strsplit(a;b;c, ;, fixed T) # 按照;切分字符串 strsplit(a222b2.2c, 2.2, fixed F) # 按照正则表达式分隔,这里的.是…

15.1 BP神经网络实现图像压缩——了解神经网络在图像处理方面的应用(matlab程序)

1.简述 BP神经网络现在来说是一种比较成熟的网络模型了,因为神经网络对于数字图像处理的先天优势,特别是在图像压缩方面更具有先天的优势,因此,我这一段时间在研究神经网络的时候同时研究了一下关于BP网络实现图像压缩的原理和过程,并且是在MATLAB上进行了仿真的实验,结果发现设…

Java:ThreadLocal解析

Java:ThreadLocal解析 前言一、 什么是ThreadLocal?二、ThreadLocal的内存泄漏问题1.什么是内存泄漏?2.为什么会出现内存泄漏问题?3.如何解决内存泄漏问题?(1)ThreadLocal会自动清除key为null的…

层级在BW4HANA中的处理

目录 1.从flatfile加载层级的处理 2. 从ERP数据源抽取区间层级到BW 2.1 在ERP中的层级数据源 2.1.1 PSA格式和IDoc格式的区别 2.1.2 怎么查看Interval的字段 2.1.3 如何在S4里查看层级数据源结构 2.1.4 关于时间相关层级date to和date from 1.从flatfile加载层级的处理 层…

【快速开始】一个简单的Flask-SocketIO应用,完成后端推送消息接收与关闭

效果图 先看运行效果图 OK,下面开始。 安装环境 本人使用环境及版本: Anaconda: 虚拟环境: Python版本:3.8.13 安装包及版本: Flask-SocketIO:5.3.4 eventlet:0.33.3 快速开…

BUU [ZJCTF 2019]NiZhuanSiWei

BUU [ZJCTF 2019]NiZhuanSiWei 先看题目,提示了useless.php。 猜到了flag在哪。 没啥可以学的,直接上exp。 ?textdata://text/plain,welcome to the zjctf &filephp://filter/readconvert.base64-encode/resourceuseless.php &passwordO:4:&q…

工作学习总结:安卓地图SDK测试--前置准备阶段8天

工作学习总结:安卓地图SDK测试--前置准备阶段8天 安卓地图SDK测试--前置准备阶段8天前置知识:1、安卓环境开发部署2、高德 SDK demo 如何进行调试(1)SHA1 密钥无法获取(2)下载了高德 3D 地图 demo&#xff…

Leetcode---352周赛

周赛题目 2760. 最长奇偶子数组 2761. 和等于目标值的质数对 2762. 不间断子数组 2763. 所有子数组中不平衡数字之和 一、最长奇偶子数组 这题的数据范围允许用暴力来做,只要我们分别枚举左端点left和右端点right,然后看区间[left,right]是否符合题目条…

stable diffusion 百宝书

文章目录 0. 环境搭建0.1 Windows0.1.1 git环境安装0.1.2 python 环境搭建0.1.2.1 配置pip国内镜像源 0.1.3 stable diffusion环境搭建0.1.3.1 远程访问Stable diffusion0.1.3.2 模型 Lora下载 1. 基础知识1.1 Stable Diffusion Webui及基础参数1.2 参数说明1.2.1 采样方法1.2.…

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B 简介环境配置环境搭建依赖安装 代码及模型权重拉取拉取 Chinese-LLaMA-Alpaca拉取 llama-30b-hf 模型权重及代码拉取 chinese-llama-lora-33b 模型权重及代码 合并模型权重先转换 pth 类型的模型权重&…

docker版jenkins安装node打包vue2

下载node 通过jenkins配置下载因为某些原因会失败,故自己下载安装https://nodejs.org/zh-cn/download解压然后复制到docker的jenkins容器 tar -xvf node-v16.18.1-linux-x64.tar.xzdocker cp ./node-v16.18.1-linux-x64 jenkins:/node配置 jenkins-全局工具配置- …

【Vim编辑器】编码技巧:模板(自动添加信息)+配置参考(~/.vimrc)

前言: 在编写代码时,为了提高代码的可读性和维护性,我们经常在文件的头部添加一些信息提示,如作者、日期、版本号等。本文介绍了如何在 Vim 编辑器中实现自动添加信息提示的功能。 结尾提供~/.vimr参考配置,可提高代码…

短视频seo矩阵+抖音小程序源码开源部署(二)

一、 开发思路: 通过短视频seo矩阵抖音小程序的形式,实现视频的批量制作,小程序内容批量挂载,客户线索批量收集,实现企业运营价值最大化。开发逻辑:通过短视频矩阵布局seo搜索关键词,接入小程序…

Elasticsearch:文档版本控制和乐观并发控制

在今天的文章中,我来详细描述一下 Elasticsearch 文档的版本控制以及如何更新文档。你也可以阅读我之前的文章 “Elasticsearch:深刻理解文档中的 verision 及乐观并发控制”。 版本控制 我们知道 Elasticsearch 的每个文档都有一个相对应的版本。这个版…

GO微服务简介及特性介绍

微服务特性 一、微服务简介-构建单体应用 互联网技术发展迅速的今天,微服务倍受关注:文章、博客、社交媒体讨论和会议演讲都在谈论。与此同时,也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构的…

Windows系统安装JAVA步骤流程(超详细)

超详细的Windows系统安装JAVA步骤流程,Windows操作系统安装java,先下载JDK,然后配置环境变量,阿里云百科分享详细安装流程如下: 目录 Window操作系统安装java流程 下载JDK 配置环境变量 JAVA_HOME 设置 PATH设置…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…

电子电气架构——车载DoIP通信

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习二)

嵌入式操作系统FreeRTOS FreeRTOS是一个专门为轻量级嵌入式应用设计的迷你操作系统,它的主要功能由IPC、时钟管理、内存管理、任务通知以及任务调度等部分构成。 FreeRTOS的代码可以分解为三个主要区块:任务调度、通讯、硬件库。 任务调度:F…