Python——爬虫入门

爬虫的流程

第一步:获取网页内容

浏览器访问网页时也是一样,都是先发个请求获取网页内容,但是浏览器多了个渲染的步骤。

程序获取的内容都是网页源代码

第二步:解析网页内容

第三步:储存或分析数据

要做数据集就存起来,要做数据分析就形成图标之类的东西

通过robots.txt文件查看可爬取的网页范围

 HTTP请求和响应

请求

两个请求方式 

完整HTTP请求例子

 请求行包括请求的路径和HTTP协议,路径后面+?可以传递额外的查询参数,多用于Get请求,使用&进行分隔。

请求头包含给服务器的信息

Host指主机域名,通过DNS解析后可以找到主机IP,结合请求头里的资源路径就是一个完整的网址。

User-Agent用于告知服务器客户端的相关信息

Accept是告诉服务器客户端想接受的响应数据类型 响应

  组成

状态行 

常见状态码 

响应头 

包含生成响应的时间和返回内容的类型和编码格式

响应体 

类型是HTML就返回HTML内容,是JSON就返回json内容

使用Python Requests库发送请求和获取响应数据

首先要先安装Requests库

在终端输入

pip install requests

使用requests发送请求,这里网站是我的博客网站

使用requests库发送请求时会自动生成请求头的其他信息,不需要手动指定

import requests
respose=requests.get("http://yhy2002.com/")
print(respose)
#响应的状态码
print(respose.status_code)
print(respose.ok)
#响应体
print(respose.text)

成功获得响应 

 如果要修改请求头的话要指定一个header的参数

用处:把爬虫程序伪装成正常浏览器

 使用浏览器发送请求时请求头会自动带有浏览器类型和版本和电脑操作系统,用代码发送的话不会有。

对于一些网站会过滤非浏览器的请求,拒绝来自程序的请求

 

 

状态码用于判断请求是否成功

 

 使用requests获取豆瓣电影top250的源码

豆瓣电影 Top 250

 

import requests
response = requests.get("https://movie.douban.com/top250")print(response.status_code)

输出418状态码:这里是因为豆瓣服务器针对爬虫做的处理

 自动请求头伪装浏览器

使用f12可以看见右下角有User-Agent:

放到自定义请求头里面即可 

import requests
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
}response = requests.get("https://movie.douban.com/top250", headers=headers)print(response.status_code)
print(response.text)

 正常输出

 使用Beautiful Soup解析HTML内容

在终端输入

pip install bs4

Beautiful Soup是用到的类,要从bs4进行引入

 Beautiful Soup会把内容解析成一个树状结构

 

from bs4 import BeautifulSoup
import requests
content=requests.get("https://www.yhy2002.com/").text
#使用BeautifulSoup解析获取的网页内容,要指定解析器
#并返回一个实例对象
soup=BeautifulSoup(content,"html.parser")#打印第一个title标签内容
print(soup.title)
#打印第一个img标签
print(soup.img)#根据标签和属性造出所有符合要求的元素
list=soup.findAll("img",attrs={})
#attrs={"class":"p_color"},这个可选可不选
for a in list:print(a)#string属性可以把标签包围的文字返回print(a.string)#打印string中索引值大于2的部分print(a.string[2:])

输出

 查找包含在同一类标签下的子元素

 使用findall方法进行两重循环 

提取豆瓣电影top250的所有标题

可以看见所有标题都是一个span元素,并且class的值都是一个title 

from bs4 import BeautifulSoup
import requestsheaders={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
}
html=requests.get("https://movie.douban.com/top250" , headers=headers).text#获得解析后的实例对象
soup = BeautifulSoup(html,"html.parser")all_titles = soup.findAll("span", attrs={"class":"title"})for title in all_titles:title_string=title.stringif("/" not in title_string):print(title.string)

 输出获取的第一页25个电影的值

 在第二页的链接只是增加了一个https://movie.douban.com/top250?start=25&filter=

start=25&filter=

因此使用for循环+range获取对应页面的电影

from bs4 import BeautifulSoup
import requestsheaders={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
}
for start_num in range(0,250,25):html=requests.get(f"https://movie.douban.com/top250?start={start_num}" , headers=headers).text#获得解析后的实例对象soup = BeautifulSoup(html,"html.parser")all_titles = soup.findAll("span", attrs={"class":"title"})for title in all_titles:title_string=title.stringif("/" not in title_string):print(title.string)

 输出:成功获取完整电影名单

H:\jetbrains\PyCharm\python_projects\venv\Scripts\python.exe H:\jetbrains\PyCharm\python_projects\demo.py 
肖申克的救赎
霸王别姬
阿甘正传
泰坦尼克号
这个杀手不太冷
千与千寻
美丽人生
辛德勒的名单
星际穿越
盗梦空间
楚门的世界
忠犬八公的故事
海上钢琴师
三傻大闹宝莱坞
放牛班的春天
机器人总动员
无间道
疯狂动物城
控方证人
大话西游之大圣娶亲
熔炉
教父
触不可及
当幸福来敲门
龙猫
怦然心动
末代皇帝
寻梦环游记
活着
蝙蝠侠:黑暗骑士
哈利·波特与魔法石
指环王3:王者无敌
乱世佳人
我不是药神
飞屋环游记
素媛
哈尔的移动城堡
十二怒汉
何以为家
摔跤吧!爸爸
让子弹飞
鬼子来了
天空之城
猫鼠游戏
少年派的奇幻漂流
海蒂和爷爷
钢琴家
大话西游之月光宝盒
指环王2:双塔奇兵
闻香识女人
罗马假日
天堂电影院
死亡诗社
绿皮书
大闹天宫
黑客帝国
指环王1:护戒使者
教父2
狮子王
辩护人
饮食男女
搏击俱乐部
美丽心灵
本杰明·巴顿奇事
穿条纹睡衣的男孩
窃听风暴
情书
两杆大烟枪
西西里的美丽传说
音乐之声
看不见的客人
阿凡达
拯救大兵瑞恩
小鞋子
飞越疯人院
哈利·波特与死亡圣器(下)
沉默的羔羊
布达佩斯大饭店
禁闭岛
蝴蝶效应
致命魔术
功夫
心灵捕手
海豚湾
哈利·波特与阿兹卡班的囚徒
低俗小说
春光乍泄
超脱
美国往事
摩登时代
喜剧之王
致命ID
杀人回忆
七宗罪
红辣椒
加勒比海盗
哈利·波特与密室
一一
狩猎
唐伯虎点秋香
7号房的礼物
被嫌弃的松子的一生
请以你的名字呼唤我
断背山
剪刀手爱德华
入殓师
爱在黎明破晓前
勇敢的心
蝙蝠侠:黑暗骑士崛起
第六感
重庆森林
幽灵公主
超能陆战队
爱在日落黄昏时
菊次郎的夏天
甜蜜蜜
天使爱美丽
阳光灿烂的日子
借东西的小人阿莉埃蒂
小森林 夏秋篇
完美的世界
消失的爱人
无人知晓
倩女幽魂
寄生虫
时空恋旅人
侧耳倾听
小森林 冬春篇
幸福终点站
驯龙高手
一个叫欧维的男人决定去死
教父3
未麻的部屋
萤火之森
怪兽电力公司
哈利·波特与火焰杯
傲慢与偏见
玩具总动员3
新世界
釜山行
神偷奶爸
被解救的姜戈
玛丽和马克思
告白
大鱼
哪吒闹海
射雕英雄传之东成西就
喜宴
茶馆
头号玩家
模仿游戏
阳光姐妹淘
九品芝麻官
我是山姆
花样年华
色,戒
血战钢锯岭
恐怖直播
七武士
头脑特工队
惊魂记
黑客帝国3:矩阵革命
你的名字。
电锯惊魂
三块广告牌
达拉斯买家俱乐部
疯狂原始人
心迷宫
谍影重重3
上帝之城
英雄本色
卢旺达饭店
纵横四海
风之谷
海街日记
爱在午夜降临前
绿里奇迹
记忆碎片
岁月神偷
忠犬八公物语
疯狂的石头
荒蛮故事
雨中曲
小丑
背靠背,脸对脸
小偷家族
2001太空漫游
爆裂鼓手
无敌破坏王
无间道2
心灵奇旅
贫民窟的百万富翁
冰川时代
恐怖游轮
东邪西毒
牯岭街少年杀人事件
魔女宅急便
遗愿清单
东京教父
你看起来好像很好吃
真爱至上
大佛普拉斯
黑天鹅
可可西里
城市之光
源代码
雨人
海边的曼彻斯特
恋恋笔记本
初恋这件小事
人工智能
波西米亚狂想曲
虎口脱险
青蛇
终结者2:审判日
疯狂的麦克斯4:狂暴之路
罗生门
萤火虫之墓
新龙门客栈
千钧一发
末路狂花
崖上的波妞
无耻混蛋
奇迹男孩
彗星来的那一夜
二十二
花束般的恋爱
黑客帝国2:重装上阵
爱乐之城
血钻
战争之王
房间
步履不停
芙蓉镇
魂断蓝桥
火星救援
哈利·波特与死亡圣器(上)
千年女优
谍影重重2
弱点
阿飞正传
谍影重重
燃情岁月
朗读者
白日梦想家
再次出发之纽约遇见你
哈利·波特与凤凰社
蜘蛛侠:平行宇宙
香水
穿越时空的少女

 

扩展:

使用正则表达式可以更加精确的匹配一个或者多个目标字符 

使用多线程可以同时爬取多个页面

 

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

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

相关文章

IP 协议(网络层协议)

IP协议 IP 协议作用地址管理动态分配 IP 地址NAT 机制IPv6IP 地址的组成 路由选择 IP 协议作用 主要有两点 : 地址管理 为每个上网的设备分配一个唯一地址. 路由选择 两台主机间的信息交互, 具体走哪条线路. 地址管理 先来看看 IP协议 报文格式 : IP 协议最主要就是 32 位的…

web学习笔记1

计算机: 课程大纲:html(五条猫结构) 结构 css 表现 JavaScript 行为 html:超文本标记语言 超:超链接,能从一个网页跳转到另一个网页 标记:文本要变成超文本,就需要各…

Linux——进程信号(下)

目录 总结 一,信号保存 1.1 阻塞信号 2.2 信号在内核(操作系统)中的表示 2.3 系统接口 2.3.1 sigset_t信号集 2.3.2 信号集的操作函数 2.3.3 sigprocmask 2.3.4 sigpending 2.4 实验样例 三,信号处理 3.1 信号捕捉 3.2 sigaction接口 3.3 实验…

c++11 标准模板(STL)(std::basic_istream)(一)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式…

3D空间的旋转的各种等价形式

旋转矩阵 欧拉轴和角度&#xff08;旋转矢量&#xff09; 欧拉旋转 四元数

Linux的

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 网络配置 1、ifconfig查看网络信息 2、与网卡相关的配置文件 3、查询计算机的网络状态 4、systemctl启动/重启/停止网络 Linux远程连接与文件传输 1、为什么需要远程连接 2、SSH协议 3、sshd服务 4、…

​如何优雅的卸载Edge浏览器

如何优雅的卸载Edge浏览器 由于Edge浏览器越来越复杂&#xff0c;功能越来越繁琐我是真的一刻也用不下去了。虽然我主力是火狐浏览器&#xff0c;Edge用来访问一些只能使用Chromium内核的网页作为备用。 但是我现在一打开Edge浏览器我就窝火&#xff0c;也懒得再去调整优化&a…

Golang每日一练(leetDay0116) 路径交叉、回文对

目录 335. 路径交叉 Self-crossing &#x1f31f;&#x1f31f;&#x1f31f; 336. 回文对 Palindrome Pairs &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…

【Java遇错】Error: failed to initialize Sentinel CommandCenterLog

问题描述&#xff1a; 引入sentinel的相关依赖之后&#xff0c;启动项目服务&#xff0c;发现如下错误 Error: failed to initialize Sentinel CommandCenterLog java.lang.NoClassDefFoundError: com/alibaba/csp/sentinel/log/LoggerSpiProviderat com.alibaba.csp.sentin…

Python应用实例(一)外星人入侵(五)

外星人入侵&#xff08;五&#xff09; 1.项目回顾2.创建第一个外星人2.1 创建Alien类2.2 创建Alien实例 3.创建一群外星人3.1 确定一行可容纳多少个外星人3.2 创建一行外星人3.3 重构_create_fleet()3.4 添加行 在游戏《外星人入侵》中添加外星人。我们将首先在屏幕上边缘附近…

Cannot find tomcat-9.0.0.M21/bin/setclasspath.sh

问题描述&#xff1a;将linux上的tomcat直接拷贝到以一个路径下&#xff0c;执行sh startup.sh 报错 解决&#xff1a;修改全局变量配置文件 1、vim /etc/profile &#xff08;主要修改如下图所标记的值 &#xff09; 2、source /etc/profile &#xff08;设置环境变量立即…

C. Vampiric Powers, anyone? - 思维+前缀和

分析&#xff1a; 添加新元素的操作可以理解为添加任意一段以n结尾的异或和&#xff0c;当原数组总异或和与新加的元素进行异或又可以得到剩余的前缀的异或和&#xff0c;假设新加的元素的值是i到n的异或和x&#xff0c;那么总异或和sumpre^x&#xff0c;所以sum^xpre&#xff…