【Python】什么是爬虫,爬虫实例

news2024/9/21 2:40:56

 

 有s表示加密的访问方式

一、初识爬虫

什么是爬虫
网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略
爬虫可以做什么
你可以爬取图片,爬取自己想看的视频等等,只要你能通过浏览器访问的数据都可以通过爬虫获取。
爬虫的本质是什么
模拟浏览器打开网页,获取网页中我们想要的那部分数据.

二、爬虫的基本流程


 爬虫是通过链接去模拟浏览器去获得网页,之所以可以获取数据,是因为服务器可以通过我们给他发送的路径给我们响应;

服务器将数据发给网页,浏览器将数据解析为我们所看到的,所以爬虫爬的不仅仅是网页,还是网页的源代码,所以我们还要通过re正则等方法将所需要的数据提取出来。


响应头是我们发给服务器的

服务器发给我们的是“响应"里的数据;

 如果我们不给服务器发送头部,服务器是不会给我们响应的;

三、编程规范

这一行代码可以控制多个代码之间了执行顺序


def text1(a):
    print('hello', a)
text1(1)


if __name__ == "__main__":
    text1(2)

 可以看到先执行了text(1),因为py文件它是从上开始执行的,但是有了if __name__ == "__main__"之后,就不用再写text()了,直接在if里写,可以更好的控制执行流程;它相当于整个程序的执行入口。


四、引入自定义的模块

引入模块简单来说就是把别人写好的代码中的某个函数拿过来应用在我们需要的地方


【举个栗子】

 其中text1相当于一个包,test1.py是其中的一个模块,在text2中的text2.py中我们引用了text1包中的text1.py模块中的add函数。

五、requests库

下面使用 Python 内置的 requests 模块,该模块主要用来发送 HTTP 请求,requests 模块比 urllib 模块更简洁。


使用 requests 发送 HTTP 请求需要先导入 requests 模块:

import requests

导入后就可以发送 HTTP 请求,使用 requests 提供的方法向指定 URL 发送 HTTP 请求,例如:

# 导入 requests 包
import requests

# 发送请求
x = requests.get('https://www.runoob.com/')

# 返回网页内容
print(x.text)

每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,如状态码、响应头、响应内容等:

print(response.status_code)  # 获取响应状态码
print(response.headers)  # 获取响应头
print(response.content)  # 获取响应内容

更多响应信息如下:

属性或方法说明
apparent_encoding编码方式
close()关闭与服务器的连接
content返回响应的内容,以字节为单位
cookies返回一个 CookieJar 对象,包含了从服务器发回的 cookie
elapsed返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
encoding解码 r.text 的编码方式
headers返回响应头,字典格式
history返回包含请求历史的响应对象列表(url)
is_permanent_redirect如果响应是永久重定向的 url,则返回 True,否则返回 False
is_redirect如果响应被重定向,则返回 True,否则返回 False
iter_content()迭代响应
iter_lines()迭代响应的行
json()返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)
links返回响应的解析头链接
next返回重定向链中下一个请求的 PreparedRequest 对象
ok检查 "status_code" 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
raise_for_status()如果发生错误,方法返回一个 HTTPError 对象
reason响应状态的描述,比如 "Not Found" 或 "OK"
request返回请求此响应的请求对象
status_code返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
text返回响应的内容,unicode 类型数据
url返回响应的 URL

1)requests 方法

requests 方法如下表:

方法描述
delete(urlargs)发送 DELETE 请求到指定 url
get(urlparams, args)发送 GET 请求到指定 url
head(urlargs)发送 HEAD 请求到指定 url
patch(urldata, args)发送 PATCH 请求到指定 url
post(urldata, json, args)发送 POST 请求到指定 url
put(urldata, args)发送 PUT 请求到指定 url
request(methodurlargs)向指定的 url 发送指定的请求方法

 六、设置超时

如果服务器有排斥,不想给你回应,这时候你可能会处于一直等待状态,但你又不可能一直等待,这时候就要设置超时时间;

import requests

reponse = requests.get('https://b2.faloo.com/y_0_1.html',timeout=0.01)

七、超时处理

为了让代码更健壮需要对超时进行检测;

import requests

try:
    reponse = requests.get('https://b2.faloo.com/y_0_1.html',timeout=0.01)
except requests.exceptions.ConnectTimeout as a:
    print('time out!')
 # except是检测内容,只要遇到"requests.exceptions.ConnectTimeout"就输出"time out!"

八、获取状态码,获取响应头

import requests

response = requests.get('https://b2.faloo.com/y_0_1.html')
print(response.status_code)  # 获取状态码
print(response.headers)  # 获取响应头

九、如何解决爬取网页时无报错却没有内容的问题

有时候,我们爬取一个网页,发现没有报错,但是没有任何内容显示,可能是因为访问的网站有反爬虫机制,而解决方法就是通过模拟浏览器来访问。


我们直接爬取豆瓣电影网页,发现没有报错,但是没有任何内容显示;


想要解决这个问题,首先我们要通过下面的方法获得header中user-agent的内容。

 requests.get(url=, headers=)

其中最重要的参数是url,headers

import requests


url = 'https://movie.douban.com/top250'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 "
                  "Safari/537.36 Edg/112.0.1722.48",
}  # 模拟浏览器的代理,这样豆瓣就以为我们是浏览器向它发送请求,就不会阻拦

rep = requests.get(url=url, headers=headers)
print(rep.text)

可以看到页面显示成功:

十、爬虫实例

爬取的网页:飞卢小说网

链接:原创小说排行榜_免费小说下载排行榜_飞卢小说网 (faloo.com)

import re
import requests

# 爬取网页
reponse = requests.get('https://b2.faloo.com/y_0_1.html')

# 标题
div_text1 = re.findall(re.compile(r'<div class="TwoBox02_08">(.*?)</div>'), reponse.text)
title_list = []
for i in div_text1:
    title_list.append(re.findall(re.compile(r'<h1 class="fontSize17andHei" title="(.*?)">'), i)[0]) # 加下标是为了去掉括号[],因为使用?取消贪婪匹配后每一个符合条件的都是列表形式,使用下标可以将每一个小列表中的字符串取出来,方便之后的拼接
print(title_list)

# 作者
div_text2 = re.findall(re.compile(r'<div class="TwoBox02_09">(.*?)</div>'), reponse.text)
author_list = []
for i in div_text2:
    author_list.append(re.findall(re.compile(r'<a href="//b2.faloo.com/.* title="(.*?)"'), i)[0])  
print(author_list)

# 类型
div_text3 = re.findall(re.compile(r'<span class="fontSize14andHui">(.*?)</a>'), reponse.text)
model_list = []
for i in div_text3:
    model_list.append(re.findall(re.compile(r'<a href="//b2.faloo.com/l.*" title="(.*?)" target="_blank">'), i)[
                          0])  # 加下标是为了去掉括号[],因为使用?取消贪婪匹配后每一个符合条件的都是列表形式,使用下标可以将每一个小列表中的字符串取出来
print(model_list)

# 将爬取到的内容合并
multi_list = map(list, zip(title_list, author_list, model_list))
all_list = list(multi_list)
print(all_list)
with open('./novel.txt', 'w', encoding='utf-8') as fw:
    fw.write('书名                            作者          类型\n')
    for i in all_list:
        fw.write('      '.join(i) +'\n')

执行成功效果图:

 

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

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

相关文章

【JAVAEE】JAVA数据库连接(JDBC)

1.什么是JDBC&#xff1f; Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsyste…

[优雅的面试]MySQL与Redis双写一致性方案

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用&#xff0c;在读取缓存这方面基本都是一致的&#xff0c;大概都是按照下图的流程进行操作&#xff1a; 但是在更新缓存方面&#xff0c;是更新完数据库再更新缓存还是直接删除缓存呢&#xff1f;又或者是先删除缓存再…

TypeError: Object of type ‘Decimal‘ is not JSON serializable

错误 TypeError: Object of type ‘Decimal’ is not JSON serializable 场景 该错误是在Python3中使用Flask的报错&#xff0c;之前代码是运行正常的&#xff0c;时过几年后再次安装部署&#xff0c;确出现问题。 分析 经过分析发现依旧是版本依赖导致的更新问题。最近在…

JS手写实现Promise.race

Promise.race() 是一个常见的 JavaScript Promise 方法&#xff0c;它接受一个 Promise 数组作为参数&#xff0c;并返回一个新的 Promise 对象。这个新的 Promise 对象在传入的 Promise 数组中&#xff0c;任意一个 Promise 对象状态变为 fulfilled 或者 rejected&#xff0c;…

57.网页设计图标实战

首先我们需要找一个图标库&#xff0c;本次演示采用的是heroicon ● 之后我们根据需求搜索与之想匹配的图标并复制svg代码 ● 之后将我们的代码复制到我们想要放置图标的地方 ● 当然我们需要使用CSS来修饰一下 .features-icon {stroke: #087f5b;width: 32px;height: 3…

Python——Pyqt5的数据可视化小工具(完整代码)

前言 作业要求&#xff1a;【都已经打包放网上了&#xff0c;有缘人需要就自取】 一份报告书&#xff08;在全球变暖背景下碳中和对各国的二氧化碳排放量的影响项目报告书&#xff09; 一份代码 作业包&#xff1a;python数据可视化小工具.zip - 蓝奏云 大一的时候&#xff0c;…

Java 整合常用docker Api

整合环境&#xff1a; 与docker 版本差异不大&#xff0c;基本都可以 API version: 1.26开放docker api &#xff0c;两种方式 /etc/sysconfig/docker &#xff0c;最后一行添加&#xff1b;开放端口&#xff1a;2375 -H tcp://0.0.0.0:2375systemctl status docker 查询 d…

vsftpd.conf参数配置

文章目录 初始vsftdp.conf翻译后需修改参数write_enableYES&#xff08;启用任何形式的FTP写入命令&#xff09;userlist_file/etc/vsftpd.user_list、userlist_enableYES、userlist_denyNOlocal_umask022&#xff08;放开权限&#xff09;chroot_local_userYES&#xff08;限定…

每日学术速递4.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.A Cookbook of Self-Supervised Learning 标题&#xff1a;自监督学习食谱 作者&#xff1a;Randall Balestriero, Mark Ibrahim, Vlad Sobal, Ari Morcos, Shashank Shekhar, Tom…

学知识变现,看完这些就够了

点击查看【18本知识变现电子书】 100个实用知识点 60万字知识变现精华 资深知识变现教练海哥扛鼎之作 2000多位学员实战经验干货总结 从理论到实践&#xff0c;从思维到实操 教你彻底学透如何知识变财富 .......... 全网最全知识变现知识付费电子教程 资深知识变现教练海…

Linux线程相关函数:线程的创建、属性、回收、退出、取消

1. 线程号 进程号在系统中唯一&#xff0c;但线程号只在其所属进程环境中有效。 &#xff08;1&#xff09;pthread_self函数 #include<pthread.h>pthread_t pthread_self(void); /* 功能&#xff1a;获取线程号 返回值&#xff1a;调用此函数线程的ID */ pthread_se…

【Unity-UGUI控件全面解析】| Panel 容器组件详解

🎬【Unity-UGUI控件全面解析】| Panel 容器组件详解一、组件介绍二、组件属性面板三、代码操作组件💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游…

2007-2020年上市公司数字经济化指标含原始数据和计算代码(do文档)

2007-2020年上市公司数字经济化指标含原始数据和计算代码&#xff08;do文档&#xff09; 1、时间&#xff1a;2007-2020 2、范围&#xff1a;A股上市公司剔除jin rong行业 3、数据说明&#xff1a;包含计算过程和原始数据 4、参考文献&#xff1a;祁怀锦,数字经济对公司治…

利用C#实现动态替换桌面快捷方式对应的应用程序

公司有一个特殊的业务可能会用到这个&#xff0c;至于什么业务就不展开了。本文的内容作为备用方案。 实现思路&#xff1a; 1 获取当前exe程序运行的全路径 2 获取桌面的所有快捷方式 3 遍历快捷方式&#xff0c;获取快捷键方式对应程序的运行路径&#xff0c;并与当前…

【开发工具】 今天我要教会你安装Office 2021 RTM 专业增强零售版 你开不开心

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

统一请求封装和pytest入门使用

统一请求封装解决的问题 解决多个py文件共享session的问题 统计请求的数据 统一异常处理 统一日志监控 封装 在项目文件中创建一个common文件夹&#xff0c; 用来进行统一接口封装 import requestsclass RequestUtil:# 调用底层的requests.session()方法进行封装sess r…

超详细的R语言svykm函数绘制复杂抽样设计数据cox回归生存曲线(Kaplan-Meier)

我们在既往的文章《R语言绘制复杂抽样设计数据cox回归生存曲线(Kaplan-Meier)》中介绍了怎么使用jskm包的svykm函数绘制复杂抽样设计数据cox回归生存曲线(Kaplan-Meier)&#xff0c;但是有粉丝觉得讲得不够详细&#xff0c;希望讲得详细一点&#xff0c;今天我们继续来介绍一下…

flinkCDC在Delta.io中是什么 是CDF

类似flink CDC databricks 官方文档: How to Simplify CDC With Delta Lakes Change Data Feed - The Databricks Blog delta.io 官方文档: Change data feed — Delta Lake Documentation 概述 更改数据馈送 (CDF) 功能允许 Delta 表跟踪 Delta 表版本之间的行级更改 在…

vue+element-plus角色权限管理分配

这里的图片是截图这个老师的项目 在src/uitls/permission.js加入以下内容 本段代码讲解: 参数一:后台传来的路由 参数二:前端所有的路由 先遍历前端所有路由,在里面继续遍历后台路由,通过二者某一个关键字的是否相同判断用户是否有权限(这里老师使用的是title关键字),关键字相…

21安徽练习

题目分为4部分 APK 集群 流量 exe 我尽量都做一下&#xff0c;逆向不是很会&#xff0c;就当提升自己。 [填空题]请获取app安装包的SHA256校验值&#xff08;格式&#xff1a;不区分大小写&#xff09;&#xff08;10分&#xff09; e15095d49efdccb0ca9b2ee125e4d8136cac5…