爬虫一些基础知识的备忘录(需要自取)

devtools/2025/3/13 10:12:01/

前言

基础薄弱,或许是ai用多的缘故,记录了写爬虫需要的一些基础知识,需要自取

这里记录一些我初学爬虫的时候经常忘记的东西,包括但不限于一些文件的读写和一些其他的东西

文件读写

文件读写,如果想表达——若文件存在,就直接使用,若不存在就创建,可以这样写,避免会报一些很sb的文件不存在的错误

文件创建

if not os.path.exists("D:/这里写你的路径"):os.mkdir("D:/这里写你的路径")

文件读写

urlretrieve(j.get('src'),"C:/Users//Desktop/漫画/"+str(i)+"/"+str(shix)+".jpg")

这里第一个参数写目标文件下载链接,第二个就是你的path路径,比如要下载一个图片,那么就是图片路径+保存的文件夹路径+文件名,str(shix).jpg就是要保存的文件名

那么如果想爬取小说怎么办?就是上面是下载某个文件或者图片自动保存的逻辑

可以用write持续写入

    with open(f"D:/小说/三国演义/三国演义.txt", "a+", encoding='utf-8') as f:f.write(name + "\n")for p in title:f.write(p.text + "\n")

关于open的第二个参数,这里记录了几个常用的

读写参数

符号作用
a+读追加模式(读取从头,追加从末尾)
r只读模式
w只写模式(如果文件存在,则清空文件内容)
a追加模式(如果文件存在,指针位于文件末尾)
r+读写模式(指针位于文件开头)
w+写读模式(如果文件存在,则清空文件内容)

正则匹配

如果要使用正则来匹配数据的话,需要对响应回来的response进行匹配,要事先写好自己的pattern

导入re

    response = requests.post(url, headers=headers)print(response.text)pattern = r'data-original="([^"]+)"'matches = re.findall(pattern, response.text)

execjs的使用

result_data = execjs.compile(open('D:\project\stock_spider\spider\.js', 'r', encoding='utf-8').read()).call(('main'),data)

call里面的参数是js文件中要运行的参数,data是需要使用js文件处理的数据

soup的使用

soup解析使用前要先对响应的response做字符串处理,然后才能进入解析

res = cffi_requests.get(f"https://www.beqege.cc/2/2{i}.html", impersonate='chrome110', timeout=10, verify=False)res = res.textsoup = BeautifulSoup(res, "lxml")

find方法

返回一个对象
soup.find('a')
soup.find('a', class_='xxx') # 注意class后的下划线
soup.find('a', title='xxx')
soup.find('a', id='xxx')
soup.find('a', id=compile(r'xxx'))

find_all

soup.find_all('a')
soup.find_all(['a','span']) #返回所有的a和span标签
soup.find_all('a', class_='xxx')
soup.find_all('a', id=compile(r'xxx'))
# 提取出前两个符合要求的
soup.find_all('a', limit=3)

获取文本

# 获取标签的值的三种方法soup.p.stringsoup.p.textsoup.p.get.text()

获取属性

# 获取p标签的属性
# 方法一
soup.p.attrs(返回字典) or soup.p.attrs['class'](class返回列表,其余属性返回字符串)# 方法二
soup.p['class'](class返回列表,其余属性返回字符串)# 方法三
soup.p.get('class')(class返回列表,其余属性返回字符串)

xpath

xpath是一种用于在xml文档中定位节点的语言,它可以用于从xml文档中提取数据,以及在xml文档中进行搜索和过滤操作,xpath使用路径表达式来描述节点的位置,

image-20250115184801464

xpath基础使用

from lxml import etreeimport requestsurl = 'https://www.douguo.com/'res = requests.get(url)#print(res.text)
html = etree.HTML(res.text)
# /从根节点选取(取子节点)。
rest = html.xpath('/html/head/title/text()')  # 返回Element对象
title_text = html.xpath('//title/text()')#这个是选取所有title标签的text内容
attr = html.xpath('//meta/@name')#这个是选取所有meta标签的name属性值
index = html.xpath('//meta[@name="author"]')#这个是选取所有name属性值为author的meta标签
index = html.xpath('//*[@class="item"]')#这个是选取所有class属性值为item的标签
index = html.xpath('//meta[@*="keywords"]')#这个是选取所有含有keywords的meta标签
link_list=html.xpath('//*[contains(@id, "chapter-img)]/@src ')#寻找元素中id包含又chapter-img元素的标签中的src
print(rest)

image-20250111215937861

selenium

使用selenium进行人工输入验证码获取cookies

def login_manually(login_url, cookies_file, browser=None):# 既然是手动,这里就不自动填写用户名和密码了if browser is None:browser = webdriver.Chrome()browser.get(login_url)time.sleep(30) # 给自己多了点时间输入用户名、密码、验证码cookies = browser.get_cookies()#直接用browser获取cookiesprint(cookies)save_cookies(cookies, cookies_file)

打开猿人学,上下滑动,并且打开一篇文章,搜索框搜索并回车

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time#打开Chrome浏览器
driver = webdriver.Chrome()
#浏览器最大化
driver.maximize_window()
#打开猿人学首页
driver.get('https://www.yuanrenxue.cn')
time.sleep(3)#滑动到页面中间处
driver.execute_script("window.scrollTo(0,document.body.scrollHeight/2)")
time.sleep(3)#滑动到页面最下方
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(3)#滑动到页面最上方
driver.execute_script("window.scrollTo(0,0)")
time.sleep(3)#通过html的class属性来定位链接位置,并点击
driver.find_element(By.CLASS_NAME,'slide-left').click()
time.sleep(3)#定位页面右上角的搜索图标并点击
driver.find_element(By.CLASS_NAME,'search-show').click()#找到输入框
search = driver.find_element(By.CLASS_NAME,"search-input")
#输入 Python教程
search.send_keys(u'python教程')
time.sleep(7)
#回车
search.send_keys(Keys.RETURN)time.sleep(5)
driver.quit()

记得一定要调用driver.quit()退出

这里直接用了sleep进行等待网站加载,但是selenium有自己的等待函数

selenium定位元素的函数

类似driver.find_element_by_class_name('search-show').click()

函数功能
find_element_by_class_name通过class name定位元素
find_element_by_id通过id定位元素
find_element_by_tag_name通过html tag定位
find_element_by_css_selector通过css来定位
find_element_by_name通过name定位
find_element_by_xpath通过xpath来定位
find_elements_by_link_text通过文字链接来定位

find_element_by_link_text(u’Python教程’)

element后面多了一个s,会以列表的形式把定位到的相同元素全部返回,你要知道你需要的元素是第几个,通过数组下标来取对应的元素。比如你要点击某个网站第三个链接,写法如下: find_elements_by_tag_name(‘a’)[2].click()

通过xpath来定位 |
| find_elements_by_link_text | 通过文字链接来定位 |

find_element_by_link_text(u’Python教程’)

element后面多了一个s,会以列表的形式把定位到的相同元素全部返回,你要知道你需要的元素是第几个,通过数组下标来取对应的元素。比如你要点击某个网站第三个链接,写法如下: find_elements_by_tag_name(‘a’)[2].click()


http://www.ppmy.cn/devtools/166738.html

相关文章

3.12-1 html讲解

一、html介绍 1、定义:一个超文本标记语言,不是一种编程性语言 2、标记:记号(绰号) 3、超文本:就是页面内容包含图片、链接、音乐、视频等素材 4、为什么学习html?a测试页面功能&#xff0c…

【C++ STL】 容器详解:priority_queue 学习

在 C STL(标准模板库)中,priority_queue 是 优先队列,它是一种特殊的队列,出队顺序 按照优先级排序,而非 FIFO(先进先出)。底层实现通常基于 堆(heap) 数据结…

c++介绍信号六

信号量是c中实现对有限资源访问控制,现成通过信号量获得对资源访问的许可。可用资源大于0,线程可以对资源进行访问,此时计数器减1。当计数器为0时,不可访问资源,线程进入等待。当资源释放时,线程结束等待&a…

Day24 洛谷真题讲解(递归方法找数)

我当时一看到这道题,第一想法就是如何能整k个循环,其实自己也知道这个几乎没法整, 然后我就感觉这道题很可以利用到那些复杂的方法 但是我真的没想太通 然后在一个很好的up主中我找到了一个讲的很好的 大家看下面的那个 大家重点看一下上…

大白话如何使用 CSS 实现响应式布局?请列举一些常见的方法。

大白话如何使用 CSS 实现响应式布局?请列举一些常见的方法。 答题思路 首先要解释什么是响应式布局,让读者明白其概念和重要性。然后依次介绍常见的实现响应式布局的CSS方法,包括媒体查询、弹性布局(Flexbox)、网格布…

【蓝桥杯每日一题】3.8

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x 抱一丝各位,前面两个月生了一场重病没有更新,懒病太严重了,从现在开始接着这个专题更新 每天刷一题,头发少一根;但若放弃治疗…

数据量过大的时候导出数据很慢

原因解析 速度慢无非两个原因: sql取数很慢程序很慢 sql很慢有3种原因: sql本身查询不合理,需要优化数据库没有索引多次频繁访问数据,造成了不必要的开销 取消多次获取数据,一次获取 框定一个大致的范围,获取此次查询的所有数据使用map设置数据,没有主键使用傅和主键拼接数据 /…

Java多线程与高并发专题——阻塞和非阻塞队列的并发安全原理是什么?

引入 之前我们探究了常见的阻塞队列的特点,在本文我们就以 ArrayBlockingQueue 为例,首先分析 BlockingQueue ,也就是阻塞队列的线程安全原理,然后再看看它的兄弟——非阻塞队列的并发安全原理。 ArrayBlockingQueue 源码分析 …