当前位置: 首页 > news >正文

基于requests_html的爬虫实战

爬取博客园首页科技新闻的前10篇标题+链接试试手

网址为推荐新闻 - 科技新闻 - 博客园

代码如下

from requests_html import HTMLSession
session=HTMLSession()
r=session.get('https://news.cnblogs.com/n/recommend')
r.html.render()
all_news=r.html.find('h2.news_entry>a')
for news in all_news[:11]:print(news.text,'https://news.cnblogs.com/n/recommend'+news.attrs['href'])

r.html.find('h2.news_entry>a')   的含义是查找所有class属性为'news_entry'的<h2>标签,并返回它的直接子元素<a>标签,注意'>'表示选择直接子元素,外面不能嵌套着其它标签

输出如下

尝试保存5张python图标到一个自建文件夹中

后面的图片有Base64 编码的,要解码处理,就不爬了 

url为python图标 - 搜索 图片

提示,图片是在<img>标签中,我们把属性src的链接提取下来,再使用requests.get(url)获取图片内容

这种有规律的网页其实用xpath方法搜索很方便,以下为两张图片<img>的xpath

/html/body/div[4]/div[5]/div/div[1]/ul[1]/li[1]/div/div[1]/a/div/img
/html/body/div[4]/div[5]/div/div[1]/ul[1]/li[2]/div/div[1]/a/div/img

我本想用这个规律,可是这样就搜索不到了,可能是因为绝对 XPath 很容易因为页面结构的变化而失效,所以建议使用相对 XPath,可以更灵活地定位元素(哦哦哦!主包后期试过了,复制XPath可以爬取到,这个就是相对的,如//*[@id="mmComponent_images_1"]/ul[1]/li[1]/div/div[1]/a/div/img)。当然了,搜索方法很多,大家选择自己喜欢的就好~

代码如下

from requests_html import HTMLSession
import osos.makedirs('python_icons')  #在Python脚本运行的当前工作目录下创建一个文件夹
session=HTMLSession()
r=session.get('https://cn.bing.com/images/search?q=python%E5%9B%BE%E6%A0%87&form=HDRSC2&first=1&cw=1177&ch=723')
r.html.render()
imgs=r.html.xpath('//div[@class="img_cont hoff"]/img')
for i in range(5):url=imgs[i].attrs['src'] r=session.get(url)if r.status_code!=200:continue                                          #python_icons/是文件夹路径,'第{i+1}张'是文件名,.png是文件扩展名,表示图片with open(f'python_icons/第{i+1}张.png','wb') as f:   #with open()是Python中用于打开文件的管理器,它确保文件在操作完成后会自动关闭f.write(r.content)                                 #wb以二进制写入模式打开文件,图片要用二进制写入,r.content返回响应的二进制内容
session.close()

展示如下,在文件目录可以看到,确实是在“python_icons”文件夹

爬取实习僧平台3个职位招聘信息制作成多表单

网址实习僧|大学生实习|校招求职|校园招聘

接下来我将爬取“产品经理”“架构师”“运维工程师”这3个职位招聘信息的岗位名称、薪资、城市的数据(为了减少运行时间,我每种职位只爬取一页数据)

提示,可以观察到,每种职位的url只是keyword不同,所以我们只需要修改keyword就能访问不同职位的招聘网页

 不知道大家能否成功爬取数据呢?开始我想在外页面(如下)直接爬取,改了好几遍代码都不行,还是只能先获取招聘广告的链接再获取信息了。

代码如下

from requests_html import HTMLSession
import pandas as pd                #把标准库/第三方库pandas起别名pd
import urllib.parsesession=HTMLSession()
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0'}def getinfo(n_url):r=session.get(n_url,headers=headers)r.html.render()name=r.html.find('div.new_job_name')[0].textsalary=r.html.find('div.job_msg')[0].find('span')[0].textcity=r.html.find('div.job_msg')[0].find('span')[1].textreturn [name,salary,city]def getLinks(ul):info=[]r=session.get(ul,headers=headers)r.html.render()items=r.html.find('div.intern-wrap.interns-point.intern-item')for item in items:nurl=item.find('a')[0].attrs['href']info.append(getinfo(nurl))    #注意不是data+=,+=会把列表里的3个字符串当成3个独立元素追加,最终得到的是一维列表return infojobs=["产品经理","架构师","运维工程师"]
columns=['职位名称','薪资','城市']
with pd.ExcelWriter('job_posting.xlsx', engine='openpyxl', mode='w') as writer:   #with ... as ...上下文管理器,会把打开和关闭这两步自动帮你完成for job in jobs:                                                              #'job_posting.xlsx'是最终文件名,engine='openpyxl'是后端引擎,mode='w'表示覆盖写模式ejob=urllib.parse.quote(job)               #把中文字符转为URL百分号编码url=f"https://www.shixiseng.com/interns?keyword={ejob}&city=%E5%85%A8%E5%9B%BD&type=intern&from=menu"informs=getLinks(url)df=pd.DataFrame(informs,columns=columns)   #用二维列表和列名创建DataFrame对象df.to_excel(writer, sheet_name=job, index=False)     #.to_excel()方法,把DataFrame里的二维表格数据,写进一个Excel文件里的工作表(Sheet)

输出展示如下

结语

爬取数据后还要清洗数据、可视化数据可以的话还可以加上GUI设计,这样才是一个完整的爬虫应用,后面的步骤比较笼统,我就不演示介绍了。还有分享或者想了解的技术欢迎在评论区留言,爬虫这块暂时结束了。

最后分享一下格式化字符串的方法

# .format()方法,使用{}作为占位符,将值插入到字符串中
name="Alice"
age=25
message="My name is {} and I am {} years old.".format(name,age)     
print(message)
# <左对齐  >右对齐  ^居中对齐
# 可以指定占位符的宽度(默认以空格填充);对于浮点数,可以指定小数点后的位数
print("{:>10}".format("Hello"))    # 输出:     Hello
print("{:.2f}".format(3.14159))    # 输出:3.14
print("{:10.2f}".format(3.14159))  # 输出:      3.14
#f-string字符串格式化方法,使用前缀f或F,在字符串中直接嵌入表达式
name="Alice"
age=25
message=f"My name is {name} and I am {age} years old."
print(message)
#格式化选项与.format()相似
print(f"{name:^10}")     # 居中对齐,宽度为10
print(f"{3.14159:.2f}")  # 输出:3.14

附带分享一些快捷键

CTRL+C,复制选取文字

CTRL+V,粘贴复制的文字

CTRL+A,选中全部

CTRL+Z,撤销上一步

http://www.lryc.cn/news/587213.html

相关文章:

  • 【DVWA系列】——File Upload——low详细教程(webshell工具冰蝎)
  • Vue Router 完全指南:从入门到实战,高效管理前端路由
  • 12.I/O复用
  • 光盘处理难题不用愁,DVDFab 来救场
  • 博客项目 laravel vue mysql 第五章 标签功能
  • 从 Intel MacBook 迁移到 ARM MacBook 的完整指南
  • 【牛客刷题】四个选项:高考选择题方案统计(并查集+动态规划)
  • 【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】
  • 时序预测 | Matlab代码实现VMD-TCN-GRU-MATT变分模态分解时间卷积门控循环单元多头注意力多变量时序预测
  • 【Linux系统】进程状态 | 进程优先级
  • 未来航空电子系统
  • C语言基础知识--文件读写(一)
  • 移动端设备本地部署大语言模型(LLM)
  • React强大且灵活hooks库——ahooks入门实践之状态管理类hook(state)详解
  • [Plecs基础知识系列]基于Plecs的半导体热仿真方法(实战篇)_1.建立电路模型
  • Linux修炼:开发工具
  • 《每日AI-人工智能-编程日报》--2025年7月12日
  • 使用Starrocks替换Clickhouse的理由
  • LeetCode经典题解:21、合并两个有序链表
  • Mybatis自动创建数据库表,并根据创建的表自动生成Mvc框架基础代码
  • CentOS系统下前后端项目部署攻略
  • Extended Nested Arrays for Consecutive Virtual Aperture Enhancement
  • C++——static成员
  • win10下的wsl2扩充空间
  • CUDA 编程笔记:使用 CUDA 加速矩阵乘法
  • 代码随想录算法训练营第三十二天|动态规划理论基础、LeetCode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 终极剖析HashMap:数据结构、哈希冲突与解决方案全解
  • 热点代码探测确定何时JITTest01
  • 深度学习图像分类数据集—水质量识别分类
  • 【计算机网络架构】环型架构简介