【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站,并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域,在数据分析、商业领域都得到了大规模的应用。


URL

每一个URL指向一个资源,可以是一个html页面,一个css文档,一个js文件,一张图片等等。

URL的格式:protocol://hostname[:port]/path[?query]

protocol:网络传输协议

hostname:存放资源的服务器的域名或IP地址

port:是一个可选的整数,取值范围是0-65535。如果被省略了,默认http端口为80,https的端口是443。

path:路由地址,一般用来表示主机上的一个目录或文件地址,由零个或多个/符号隔开的字符串,路由地址决定了服务端如何处理这个请求。

query:从?开始到它们之间的部分就是参数,又称搜索部分或者查询字符串。


HTTP协议

HTTP(超文本传输协议)主要作用是让服务端和客户端之间进行数据交互(相互传输数据)。

HTTPS(安全超文本传输协议)是HTTP协议的安全版,对传输数据进行加密。

HTTP请求

请求类别:HTTP协议中定义了八种请求方法。主要了解两种:get和post请求。

get请求:从服务器获取数据下来,并不会对服务器资源产生任何影响的时候使用get请求。

post请求:向服务端发送数据(登录)、上传文件等,会对服务器资源产生影响时使用post请求。

请求头

User-Agent:请求载体的身份标识。在请求一个网页的时候,服务器通过这个参数就可以知道这个请求是由那种浏览器发送的。如果我们是通过爬虫发送请求,那么我们的User-Agent就是Python。不过对于有反爬虫机制的网站来说,这样就可以轻易的判断这个请求时爬虫。因此,我们要设置这个值为一些浏览器的值,来伪装我们的爬虫。

Cookie:对应的是一个用户的信息,http协议是无状态的。也就是同一个人发送了两次请求,服务器没有能力知道这两个请求是否来自同一个人,因此这时候就用cookie来做标识。

请求体:提交的内容

HTTP响应

响应行:反馈基本的响应情况

常见的响应状态码:

200:请求正常,服务器正常的返回数据

302:临时重定向。比如在访问一个需要登录的页面的时,而此时没有登录,就会重定向到登陆页面。

400:请求的url在服务器上找不到。换句话说就是请求url错误。

403:服务器拒绝访问,权限不够。

500:服务器内部错误。

响应头:对响应内容的描述。

Content-Length:服务器通过这个头,告诉浏览器回送数据的长度。

Content-Type: 服务器通过这个头,告诉浏览器回送数据的类型。


编写爬虫的基础流程

1.确定你要获取的数据,确定需要爬取的URL地址。

        网页上数据有的是通过js动态加载出来的。使用Ajax。

2.使用请求模块向URL地址发出请求,并得到响应内容。

        通过代码去发送请求

3.从响应内容中提取所需数据。

4.存储

在python的html后缀名下的文件内中写:

<script>
    let xhr = new XMLHttpRequest()
    xhr.open('GET', 'http://yu.ming(全是数字的那一串)/curl/getIp')
    //发送请求
    xhr.send()

    xhr.onload = function(){
    //json
    let data = JSON.parse(xhr.reponse)
    
    let span1 = document.createElement('span')
    let span2 = document.createElement('span')
    span1.innerHTML = 'ip:' + data.returnCitySN.ip + '<br>'
    span2.innerHTML = '地址' + data.returnCitySN.Country + '<br>'
    
    document.body.appendChild(span1)
    document.body.appendChild(span2)
    }
</script>

requests模块

在cmd窗口下pip install requests来导入第三方模块,或者在pycharm内file的setting下Python Interpreter内进行下载。

requests模块的使用

1.requests.get():表示向网站发送GET请求,获取页面响应对象。

语法:

response=requests.get(url,headers=headers,params)

url:要抓取的url地址

headers:用于包装请求头信息

params:请求时携带的查询字符串参数

2.HttpResponse响应对象:我们使用requests模块向一个URL发起请求后会返回这样的对象。

响应对象属性:

text:获取相应内容字符串类型

content:获取响应内容bytes类型(抓取图片、音频、视频文件)

encoding:查看或指定响应字符编码

request.headers:查看响应对应的请求头

cookies:获取响应的cookie,经过set-cookie动作,返回coookieJar类型

json():将json字符串类型的响应内容转换为python对象

import requests
url = 'https://www.maoyan.com/board/6?timeStamp=1707033337406&channelId=40011&index=7&signKey=05c5030979de1a94fc40756853de3ca4&sVersion=1&webdriver=false&offset=0'

# 使用requests 帮我们发送一个get请求
response = requests.get(url)    # get函数内放置url参数,获取响应内容并用一个变量来接收
print(response.request.headers)   # 获取请求头
print(response.text)     # 获取响应内容(可能会被反爬虫阻拦获取不到。此时就需要伪装一下了)

3.发送带header的请求

import requests
url = 'https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_0210197b670445ddbba4fb6fe8baceb0'
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=header)
print(response.text)
'''
正则的定义:按照一定的规则,在字符串里面匹配要找的内容
如何使用正则:导入re文件
'''
import re
# findall:找到所有满足条件的数据,得到一个列表  
re.findall()

# . 匹配一个任意字符 除了换行
# re.S 使. 可以匹配到换行符   
re.findall('a.','aba\naa',re.S)

# * 出现0次或多次   
re.findall('a*','aba\naa')

# .*贪婪匹配(尽量多匹配)   
html = '<div></div>'  print(re.findall('<.*>',html))
# 得到结果:['<div></div>']

# .*?非贪婪匹配(尽量少匹配) 
html = '<div></div>'  print(re.findall('<.*?>',html))
# 得到结果:['<div>', '</div>']

# 把想要的东西加括号,提取出来
html = '<div>XX</div>'
print(re.findall('<div>(.*?)</div>', html))   # ['XX']

关于完整使用:

import requests
base_url = 'https://movie.douban.com/chart'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}

def get_html(url):
    # 发送请求功能
    response = requests.get(url, headers=headers)
    return response.text


def parse_html(html):
    # 提取数据功能
    r_list = re.findall('<div class="pl2">.*?>\n(.*?)/.*?</a>.*?<span class="rating_nums">(.*?)</span>', html, re.S)
    return r_list


def save(data_list):
    # 存储数据功能
    for data in data_list:
        name = data[0].strip()  # 去除两边空格
        num = data[1]
        print(name, num)
        print('-'*30)


html = get_html(base_url)
# print(html)
data_list = parse_html(html)
save(data_list)

结果:

怪物 8.6
------------------------------
荒野 5.7
------------------------------
涉过愤怒的海 7.2
------------------------------
枯叶 7.9
------------------------------
坠落的审判 8.5
------------------------------
爆裂点 5.7
------------------------------
再见,李可乐 6.3
------------------------------
杂种 8.2
------------------------------
刀尖 5.3
------------------------------
花月杀手 7.3
------------------------------

存储数据到mysql内

首先导入第三方模块pymysql

写法一:

import pymysql
# 导入模块
# 建立数据库的链接
db = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    database='douban',
    user='root',
    password='123456',
    charset='utf8'
)

# 创建数据库 create database douban;(终端要输入的,否则会报错)
# 创建游标对象  通过游标对象去操作
cur = db.cursor()
# 执行操作
sql = 'insert into movie_info(name, num) values("%s", "%f")' % ('怪物', 8.6)
cur.execute(sql)
db.commit()
'''
创建表的语法:
create table movie_info(
id int primary key auto_increment,
name varchar(20),
num float(5)
);
'''
# 关闭游标对象
cur.close()
# 关闭连接
db.close()

注意:

  1. 创建数据库和创建表的代码要在cmd的mysql内部进行。
  2. 在创建表之前先使用表:use douban;
  3. 小数记得用 %f 哦.

写法二:

全部写入进该表中:

import re

import requests

import pymysql

# 建立数据库的链接
db = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    database='douban',
    user='root',
    password='123456',
    charset='utf8'
)

cur = db.cursor()
sql = 'insert into movie_info(name, num) values("%s", "%s")'

base_url = 'https://movie.douban.com/chart'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}

def get_html(url):
    # 发送请求功能
    response = requests.get(url, headers=headers)
    return response.text


def parse_html(html):
    # 提取数据功能
    r_list = re.findall('<div class="pl2">.*?>\n(.*?)/.*?</a>.*?<span class="rating_nums">(.*?)</span>', html, re.S)
    return r_list


def save(data_list):
    # 存储数据功能
    for data in data_list:
        name = data[0].strip()  # 去除两边空格
        num = data[1]
        print(name, num)
        li = [name, num]
        cur.execute(sql, li)
        db.commit()
        print('-'*30)


html = get_html(base_url)
# print(html)
data_list = parse_html(html)
save(data_list)
# 关闭游标对象
cur.close()
# 关闭连接
db.close()

注意:前面已经写入的内容要进行删除,不然会报错的(主键的唯一性)。

import re

import requests

import pymysql

# 建立数据库的链接
db = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    database='douban',
    user='root',
    password='123456',
    charset='utf8'
)

cur = db.cursor()
sql = 'insert into movie_info(name, num) values("%s", "%f")'

base_url = 'https://movie.douban.com/top250?start={}&filter='  # {}切换页数
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
def get_html(url):
    # 发送请求功能
    response = requests.get(url, headers=headers)
    return response.text


def parse_html(html):
    # 提取数据功能
    r_list = re.findall('<div class="pl2">.*?>\n(.*?)/.*?</a>.*?<span class="rating_nums">(.*?)</span>', html, re.S)
    save(r_list)


def save(data_list):
    # 存储数据功能
    for data in data_list:
        name = data[0].strip()  # 去除两边空格
        num = data[1]
        print(name, num)
        li = [name, num]
        cur.execute(sql, li)
        db.commit()
        print('-'*30)


# 对爬取的内容找规律
for start in range(0, 226, 25):
    url = base_url.format(start)
    print(url)
    html = get_html(url)
    parse_html(html)

cur.close()
db.close()

使用json来提取数据

import requests
import json

url = 'https://spa1.scrape.center/api/movie/?limit=10&offset=0'
response = requests.get(url)

json_data = response.json()   # 用json对象来进行接收
for data in json_data["results"]:
    print(data["name"])
    print(data["categories"])
    print('-'*30)

换页提取:

第一种方式:

import re

import requests

base_url = 'https://www.maoyan.com/board/4?offset={}'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}

def get_html(url):
    '''
    通过requests模块发送get请求
    :param url: 给那个url发送请求
    :return: html代码
    '''
    response = requests.get(url, headers=headers)
    print(response.url)
    return response.text

def parse_html(html):
    '''
    提取数据的函数
    :param html: 在那个代码中寻找
    '''
    r_list = re.findall('<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', html, re.S)
    save(r_list)

def save(data_list):
    for data in data_list:
        li = [
            data[0],
            data[1].split(':')[1].strip(),
            data[2].split(':')[1].strip(),
        ]
        print(li)

for offset in range(0, 91, 10):
    url = base_url.format(offset)
    html = get_html(url=url)
    parse_html(html)
    print('-'*100)

第二种方式:

import re

import requests

base_url = 'https://www.maoyan.com/board/4'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}

params = {
    "offset": 0
}
def get_html(url):
    '''
    通过requests模块发送get请求
    :param url: 给那个url发送请求
    :return: html代码
    '''
    response = requests.get(url, headers=headers, params=params)
    print(response.url)
    return response.text

def parse_html(html):
    '''
    提取数据的函数
    :param html: 在那个代码中寻找
    '''
    r_list = re.findall('<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', html, re.S)
    save(r_list)

def save(data_list):
    for data in data_list:
        li = [
            data[0],
            data[1].split(':')[1].strip(),
            data[2].split(':')[1].strip(),
        ]
        print(li)

for offset in range(0, 91, 10):
    params['offset'] = offset
    html = get_html(url=base_url)
    parse_html(html)
    print('-'*100)

https://curlconverter.com/#

代码复制copy的代码可自动生成


爬取音乐

import requests

response = requests.get('https://音乐所在网址')
print("请求成功")
song_data = response.content
with open('疑心病.mp3', 'wb')as f:
    f.write(song_data)

会添加到pycharm内,拖拽到桌面上即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP地址如何保护网络安全

面对网络攻击时&#xff0c;仅依靠常态化的网络安全防御系统已捉襟见肘&#xff0c;如联合使用IP地址数据可以形成多元化的安全解决方案&#xff0c;全面监控网络活动&#xff0c;发现潜在威胁&#xff0c;制定有针对性的应对措施。 网络攻击追踪 当网站或应用遭受DDoS等网络攻…

目标识别,跟踪模块

Tofu5m 是高性价比目标识别跟踪模块&#xff0c;支持可见光视频或红外网络视频的输入&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能&#xff0c;提供多机版与触控版管理软件&#xff0c;为二次…

游戏服务器多少钱一台?腾讯云32元,阿里云26元

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;可以选择轻量应用服务器和云服务器&#xff0c;阿腾云atengyu…

开启一个服务,将服务器指定的文件读取,传播到网上其他终端

from flask import Flask, render_template_string app Flask(__name__)app.route(/get-data) def get_data():# 读取data.txt文件的内容with open(r./2024/2/4/data.txt, r) as file:data file.read()print(data)# 返回数据的HTML表示return render_template_string(<div…

程序员的数字化工作台:理解不关机背后的逻辑与需求

目录 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a; 工作流程与需求&#xff1a; 数据安全与备份&#xff1a; 即时性与响应&#xff1a; 个人习惯等方面&#xff1a; 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a;…

【JSON2WEB】04 amis低代码前端框架介绍

1 什么是 amis amis 是一个低代码前端框架&#xff0c;它使用 JSON 配置来生成页面&#xff0c;可以减少页面开发工作量&#xff0c;极大提升效率。 看到amis一句话的介绍&#xff0c;感觉就是JSON2WEB要找的前端框架。 amis是百度开源的框架&#xff0c;毕竟是大厂&#xff0c…

JavaScript入门学习

JavaScript 一.什么是JavaScript与作用 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言 嵌入HTML中&#xff0c;与Css一样。对浏览器事件作出响应操作HTML元素及节点。可以动态操作CSS样式。在数据被提交…

操作系统基础:磁盘组织与管理【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f6e0;️1 磁盘的结构&#x1f4e1;1.1 总览&#x1f4e1;1.2 磁盘、磁道、扇区⚗️1.2.1 什么是磁盘⚗️1.2.2 什么是磁道⚗️1.2.3 什么是扇区 &#x1f4e1;1.3 …

使用No-SQL数据库支持连接查询用例的讨论

简介 在本文中&#xff0c;我们将简单介绍什么是No-SQL数据库。然后我们会讨论一种使用关系数据库比较容易实现的查询&#xff0c;即连接查询&#xff0c;怎么样使用No-SQL来实现。 什么是No-SQL数据库 与No-SQL数据库相对应的是传统的关系数据库&#xff08;RDBMS&#xff…

【教程】Linux使用git自动备份和使用支持文件恢复的rm命令

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 首先非常不幸地告诉你&#xff1a;Linux 系统的标准 rm 命令不支持文件恢复功能。一旦使用 rm 删除了文件或目录&#xff0c;它们就会从文件系统中永久删除&#xff0c;除非你使用专门的文件恢复工具尝试…

如何在 Ubuntu 上安装 ONLYOFFICE 文档 8.0

通过使用社区版&#xff0c;您有能力在您自己的服务器上部署 ONLYOFFICE 文档&#xff0c;从而使在线编辑器与 ​​ONLYOFFICE 协作平台​​​或​​其他热门系统​​进行无缝集成。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档…

ELAdmin 前端启动

开发工具 官方指导的是使用WebStorm&#xff0c;但是本人后端开发一枚&#xff0c;最终还是继续使用了 idea&#xff0c;主打一个能用就行。 idea正式版激活方式&#xff1a; 访问这个查找可用链接&#xff1a;https://3.jetbra.in/进入任意一个能用的里面&#xff0c;顶部提…

代码随想录算法训练营第四十五天(动态规划篇)|01背包

01背包理论基础 学习资料&#xff1a;代码随想录 (programmercarl.com) 相关链接&#xff1a;题目页面 (kamacoder.com) 背包题目分类 01背包定义 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次…

【Ftp客户端】FTPBox starter

Github&#xff1a; https://github.com/lihewei7/ftpbox-spring-boot-starterGitee&#xff1a; https://gitee.com/lihewei7/ftpbox-spring-boot-starter 文章目录 FTPBox是什么&#xff1f;Maven依赖使用APIuploaddownloadexistslistexecuteexecuteWithoutResult 配置单主机…

有责无权的PM如何管好项目?

一、项目经理的责任和权力分析 项目经理作为项目的责任主体&#xff0c;承担着确保项目顺利完成的重要责任。他们需要确保项目达到预期目标&#xff0c;控制项目进度、成本和质量&#xff0c;并保证项目团队的有效运作。然而&#xff0c;与责任相对应的权力却并不总是与之匹配…

Linux(三)--文件系统

Linux命令简介 [rootlocalhost ~]# 表示 Linux 系统的命令提示符。 []&#xff1a;这是提示符的分隔符号&#xff0c;没有特殊含义。 root&#xff1a;显示的是当前的登录用户&#xff0c;笔者现在使用的是 root 用户登录。 &#xff1a;分隔符号&#xff0c;没有特殊含义。 l…

安卓Termux+Hexo博客框架快速搭建本地网站并实现公网访问

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

C语言在Visual Studio 2010环境下使用<regex.h>正则表达式函数库

在Visual Studio 2010环境下&#xff0c;如果C语言想要使用<regex.h>头文件进行正则表达式匹配&#xff0c;则需要pcre3.dll这个动态链接库&#xff0c;可以去网上下载。 下载的网址是&#xff1a;Pcre for Windowspcre {whatisit}https://gnuwin32.sourceforge.net/pac…

获取 Github XX项目软件最新版本方法(通过命令行)

场景&#xff1a; 如果我们项目中需要实现某个Github公共软件的最新版本更新 那么获取软件的最新的发布版本就是一个比较重要的工作了 对此&#xff0c;Github提供对外api不需要自己手动填写脚本了 解决方案&#xff1a; 替换黄色字体的项目地址&#xff0c;然后在cmd中执行…

第1章 认识Flask

学习目标 了解Flask框架&#xff0c;能够说出Flask框架的发展史以及特点 熟悉隔离Python环境的创建方式&#xff0c;能够独立在计算机上创建隔离的Python环境 掌握Flask的安装方式&#xff0c;能够独立在计算机上安装Flask框架 掌握PyCharm配置隔离环境的方式&#xff0c;能…