python 爬虫 简单爬虫教程(requests + selenium )

article/2025/9/10 19:42:28

最近改了实验室之前的爬虫,感觉有些生疏了,故此记录一下,
我将会通过抓取网站 https://nonfungible.com/ 来进行讲解。

目录

  • requests + Chrome 浏览器
    • 使用Chrome 对目标网站信息进行解析
    • requests get 请求
    • requests 添加头
    • requests ip代理
  • 使用模拟浏览器获取一些无法解析出来的信息
    • Chrome driver 的安装和使用(windows macbook )
    • 使用beautishape 来解析源码
    • selenium 模拟点击
    • 设置无头浏览器
  • 小技巧

requests + Chrome 浏览器

使用Chrome 对目标网站信息进行解析

首先 打开使用chrome 浏览器打开目标网页,按下 f12 键打开开发者界面。点击Network 选项。开始前可以点击清除图表清理一下请求信息。
在这里插入图片描述
然后,点击下一页图表,你会发现下面出现了一大堆请求信息。
在这里插入图片描述
然后,将你想要在网页上爬取的信息复制,在下面的请求信息的Response查找。crlt + f 搜索关键字
这里我通过网页中的 id 9696 进行查找,很幸运 第一个就是我们需要的请求。
在这里插入图片描述
点开header 选项 你可以看到整个请求的所有信息。
Request url 则是请求的代码
Request method 可以知道 这是一个 get 请求
在这里插入图片描述
獲得了這些信息就可以開始我們的下一步了。那就是開始請求

requests get 请求

import requests
# ret = requests.get(<Request url>) # 填上get請求鏈接
requests.get('https://nonfungible.com/api/v4/market/history/boredapeclub?filter=%5B%7B%22id%22%3A%22saleType%22%2C%22value%22%3A%22%22%7D%5D&internal=true&length=10&sort=%5B%7B%22id%22%3A%22blockTimestamp%22%2C%22desc%22%3Atrue%7D%5D&start=10')
print(ret.text)

當然 可能還會遇到其他類型的請求像是post之類的
可以參考一下文檔
requests

requests 添加头

import requests
headers = {
"Accept":"application/json",
"Content-Type":"application/json",
"Referer":"https://nonfungible.com/market/history/cyberkongz?filter=saleType%3D&length=10&sort=blockTimestamp%3Ddesc&start=10",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
}
requests.get('https://nonfungible.com/api/v4/market/history/boredapeclub?filter=%5B%7B%22id%22%3A%22saleType%22%2C%22value%22%3A%22%22%7D%5D&internal=true&length=10&sort=%5B%7B%22id%22%3A%22blockTimestamp%22%2C%22desc%22%3Atrue%7D%5D&start=10',headers = headers)

requests ip代理

有时候因为一段时间内请求数目太多,网站就把你封了。这个时候我们除了在每次请求之前要加上一些等待以外( time.sleep(2.5 + random.random()) ),还可以设置多个ip进行爬取。

import requestsproxies_list = [{'http': '103.103.3.6:8080','https': '103.103.3.6:8080'},{'https': '211.24.95.49:47615'},
]proxies = random.choice(proxies_list)  # 从链接中随机抽一个ip出来html = requests.get('https://nonfungible.com/api/v4/market/history/boredapeclub?filter=%5B%7B%22id%22%3A%22saleType%22%2C%22value%22%3A%22%22%7D%5D&internal=true&length=10&sort=%5B%7B%22id%22%3A%22blockTimestamp%22%2C%22desc%22%3Atrue%7D%5D&start=10',headers=headers,proxies=proxies)

使用模拟浏览器获取一些无法解析出来的信息

Chrome driver 的安装和使用(windows macbook )

点击下载安装链接
安装命令

pip install selenium
chromedrive = "/usr/local/bin/chromedriver"  
driver = webdriver.Chrome(chromedrive,chrome_options=chrome_options)  # macos
driver =
webdriver.Chrome("C:\ProgramFiles\Google\Chrome\Application\chromedriver") # windows 
driver.get("https://nonfungible.com/market/history/")  # 类似于 requests.get()
time.sleep(10)
pageSource = driver.page_source  # 获取网页源码 

显式等待

  # 设置浏览器:driver  等待时间:20swait = WebDriverWait(driver, 20)# 设置判断条件:等待id='kw'的元素加载完成input_box = wait.until(EC.presence_of_element_located((By.ID, '__next')))

使用beautishape 来解析源码

from bs4 import BeautifulSouppageSource = driver.page_source
soup = BeautifulSoup(pageSource, 'lxml')

selenium 模拟点击

在这里插入图片描述
通过右键点击你想要的函数,点击检查跳转到对应的位置 copy xpath 即可获得元素的xpath
然后通过 find_element_by_xxx函数找到你想要点击的元素
最后使用你想要进行的点击动作的函数

实例:

next = driver.find_element_by_xpath("//[@id=\"__next\"]/div/div/section/div[4]/div/div/div[2]/div[2]/div/div[3]/div[3]")
next.click()

附上点击函数参考链接:

设置无头浏览器

# 导入包
from selenium.webdriver.chrome.options import Options
# 规避检测
from selenium.webdriver import ChromeOptionschrome_options = Options()
chrome_options.add_argument('User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36')# chrome_options.add_argument('--no-sandbox')                # 解决DevToolsActivePort文件不存在的报错# chrome_options.add_argument('window-size=1920x3000')       # 设置浏览器分辨率chrome_options.add_argument('--disable-gpu')               # 谷歌文档提到需要加上这个属性来规避bugchrome_options.add_argument('--hide-scrollbars')           # 隐藏滚动条,应对一些特殊页面chrome_options.add_argument('blink-settings=imagesEnabled=false')      # 不加载图片,提升运行速度# chrome_options.add_argument('--headless')# chrome_options.add_argument("--proxy-server=http://59.188.24.24:10152")# #实现规避操作# options = ChromeOptions()# options.add_experimental_option('excludeSwitches', ['enable-automation'])chromedrive = "/usr/local/bin/chromedriver"
# driver = webdriver.Chrome(chromedrive,chrome_options=chrome_options)  macos
driver = webdriver.Chrome("C:\Program Files\Google\Chrome\Application\chromedriver",chrome_options=chrome_options)

小技巧

很多情况下 我们的网络会出现一些波动,为了让程序变得更加的健壮 我们需要添加一些措施。

while True:try:<你的代码>breakexcept Exception as e:print("have some problem ",e)

单笔数据写入函数 蛮方便的
输入文件路径 要写的line 和 写入方式即可使用

# 寫入
def myWriteLine(filepath, line, model="a+"):with open( filepath , model, newline="", encoding="utf-8") as f:csv_write = csv.writer(f)x = np.array(line)if x.ndim == 1:csv_write.writerow(line)if x.ndim == 2:for l in line :csv_write.writerow(l)

保存网页函数

def saveHtml(file_name, file_content):#    注意windows文件命名的禁用符,比如 /with open(file_name + ".html", 'w', encoding='utf-8') as f:#   写文件用bytes而不是str,所以要转码f.write(file_content)

http://chatgpt.dhexx.cn/article/XKEAwoUn.shtml

相关文章

如何自学Python爬虫?详细的从入门到精通Python爬虫技能教程来了

如何自学Python爬虫&#xff1f;在大家自学爬虫之前要解决两个常见的问题&#xff0c;一是爬虫到底是什么&#xff1f;二是问什么要用Python来做爬虫&#xff1f;爬虫其实就是自动抓取页面信息的网络机器人&#xff0c;至于用Python做爬虫的原因&#xff0c;当然还是为了方便。…

Python爬虫入门教程:超级简单的Python爬虫教程

这是一篇详细介绍 [Python] 爬虫入门的教程&#xff0c;从实战出发&#xff0c;适合初学者。读者只需在阅读过程紧跟文章思路&#xff0c;理清相应的实现代码&#xff0c;30 分钟即可学会编写简单的 Python 爬虫。 这篇 Python 爬虫教程主要讲解以下 5 部分内容&#xff1a; …

python超简单爬虫教程

python超简单爬虫教程 python超简单爬虫教程七大步骤&#xff1a;1发送数据请求2请求网站源码3数据筛选4存储数据5数据可视化6数据分析7公司决策 python超简单爬虫教程 大家好&#xff01;在这里给大家交流一下小编总结得python超简单爬虫教程&#xff0c;废话不多说&#xff…

如何入门 Python 爬虫?详细教程在这里

根据本人的习惯与理解&#xff0c;用最简洁的表述&#xff0c;介绍爬虫的定义、组成部分、爬取流程&#xff0c;并讲解示例代码。 基础 爬虫的定义&#xff1a;定向抓取互联网内容&#xff08;大部分为网页&#xff09;、并进行自动化数据处理的程序。主要用于对松散的海量信…

爬虫入门教程 —— 1

爬虫入门教程 -1 很想做一些爬虫的基础性的教程&#xff0c;来与大家共同分享我的一些小经验&#xff0c; 我将以我认为的方式为大家讲解网络爬虫&#xff0c;如果你没有编程基础&#xff0c;对网络爬虫有兴趣&#xff0c;开始可能稍微有一些小难度&#xff0c;不过我希望能给…

Python爬虫简单入门教程

这篇 Python 爬虫教程主要讲解以下 5 部分 了解网页结构&#xff1b;使用 requests 库抓取网站数据&#xff1b;使用 Beautiful Soup 解析网页&#xff1b;清洗和组织数据&#xff1b;爬虫攻防战&#xff1b; 了解网页结构 网页一般由三部分组成&#xff0c;分别是 HTML&#…

Python网络爬虫使用教程

文章目录 一、URL资源抓取1.urllib2.requests3.requests-html二、正则表达式三、数据解析1.Beautiful Soup2.lxml3.selectolax四、自动化爬虫selenium五、爬虫框架1.Scrapy2.pyspider框架六、模拟登录与验证码识别七、autoscraper&#xff08;不需要编程基础&#xff09; 一、U…

爬虫入门教程

文章目录 前言一、学习爬虫前所需掌握的内容二、爬取数据2.1 如何存储数据2.2 获取html网络数据2.3 获取json网络数据2.4 获取图片数据 三、提取数据3.1 提取百度热搜信息3.2 提取豆瓣同城近期活动信息 前言 第一次接触爬虫&#xff0c;这篇博客用于记录学习的过程&#xff0c…

「爬虫教程」吐血整理,最详细的爬虫入门教程

初识爬虫 学习爬虫之前&#xff0c;我们首先得了解什么是爬虫。来自于百度百科的解释&#xff1a; 网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&…

Python爬虫之入门保姆级教程,学不会我去你家刷厕所

注重版权&#xff0c;转载请注明原作者和原文链接作者&#xff1a;Bald programmer 今天这个教程采用最简单的爬虫方法&#xff0c;适合小白新手入门&#xff0c;代码不复杂 文章目录 今天这个教程采用最简单的爬虫方法&#xff0c;适合小白新手入门&#xff0c;代码不复杂首先…

Java单元测试使用mock【转载】

1、什么是Mock? mock是在测试过程中&#xff0c;对于一些不容易构造/获取的对象&#xff0c;创建一个mock对象来模拟对象的行为。比如说你需要调用B服务&#xff0c;可是B服务还没有开发完成&#xff0c;那么你就可以将调用B服务的那部分给Mock掉&#xff0c;并编写你想要的返…

Java代码实现单元测试

单元测试&#xff1a;在编写java代码的时候&#xff0c;如果我们想去运行一个Java程序&#xff0c;那么必须创建一个main方法&#xff0c;但这样比较麻烦 比如现在我们想去测试HDFS的JavaAPI的文件上传和文件下载功能 如果使用main方法的话&#xff0c;那么我们需要创建两个J…

java单元测试(@Test)

初学者在写java代码的时候&#xff0c;可能会因为写一个小功能就要写一个类&#xff0c;写一个main方法而苦恼。其实java的工程师在很早的时候就提供了解决的方案。就是我们今天要讲 的Junit测试。 在使用的时候首先需要配置环境&#xff1a; 一、英文&#xff1a; 选中一个…

java单元测试方法的使用

单元测试方法的使用 java单元测试是最小的功能单位测试代码&#xff0c;我们在编写大型程序的时候&#xff0c;需要写成千上万个方法或函数&#xff0c;这些函数的功能可能很强大&#xff0c;但我们在程序中只用到该函数的一小部分功能&#xff0c;如果想要测试这些方法函数的…

java单元测试的编写及运行方法

java单元测试的方法 1、为什么要进行单元测试 因为单元测试相当于测试的某个功能点&#xff0c;不是针对整个业务进行的测试&#xff0c;例如如果只想调试某个类下的功能&#xff0c;但又想把多个类写在一个java文件里&#xff0c;就可以采用单元测试的方法 2、怎么创建及运…

Java单元测试框架 - JUnit

导航 我们为什么需要单元测试框架&#xff1f;为工程添加JUnit支持编写JUnit单元测试案例JUnit常用注解JUnit常用断言JUnit案例Spring整合 我们为什么需要单元测试框架&#xff1f; 当我们需要对一段代码进行测试时&#xff0c;怎么样让他快速跑起来呢&#xff1f;一个很自然的…

java单元测试之mock篇

java单元测试之mock篇 一、什么是mock&#xff1f;二、为什么要进行mock&#xff1f;三、IDEA中使用Mock3.1、引入mock所需依赖3.1、IDEA单元测试必备快捷键3.2、Mock测试相关注解Mock注解InjectMocks注解调用PowerMockito.spy()方法Mock使用方式或者技巧静态方法mockStaticPre…

Java单元测试之Mock框架

一、引言二、为什么要用Mock三、Mock使用场景四、Mock定义五、Mock框架五、Mockito5.1 Mockito基本使用5.2 MockMVC测试5.2.1 初始化MockMvc对象5.2.2 接口测试5.2.3 常用API 一、引言 实际工作中&#xff0c;可能会遇到如下情况&#xff1a; 场景一&#xff1a;依赖接口不通…

Java单元测试实践-01.单元测试概述与示例

Java单元测试实践-00.目录&#xff08;9万多字文档700多测试示例&#xff09; https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 以下内容为本人以开发人员的视角&#xff0c;在平时进行单元测试过程中的总结。主要内容为通用的&#xff0c;不限制具体业务…

如何写Java单元测试

本文引自https://www.cnblogs.com/ysw-go/p/5447056.html 什么是单元测试   我们在编写大型程序的时候&#xff0c;需要写成千上万个方法或函数&#xff0c;这些函数的功能可能很强大&#xff0c;但我们在程序中只用到该函数的一小部分功能&#xff0c;并且经过调试可以确定…