python爬虫入门教程

安装python

中文网   Python中文网 官网

安装好后打开命令行执行(如果没有勾选添加到Path则注意配置环境变量)

python

出现如上界面则安装成功

设置环境变量

右键我的电脑->属性

设置下载依赖源

默认的是官网比较慢,可以设置为清华大学的地址

 

python -m pip install --upgrade pip
pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

 

 

正则表达式

查看地址   正则表达式-CSDN博客

实操

创建项目后安装requests

pip install requests

入门 

搜狗网址搜索周杰伦爬虫

获取地址

 

发现浏览器地址很长,可以简化为  https://www.sogou.com/web?query=周杰伦

 上代码

import requests
url = "https://www.sogou.com/web?query=周杰伦"
res = requests.get(url)
print(res.text)
res.close()

结果

上面显示非浏览器发送,我们模拟浏览器发送,然后操作,打开浏览器控制台,访问 https://www.sogou.com/web?query=周杰伦 ,

那么我们在header中添加如上代码

import requests
url = "https://www.sogou.com/web?query=周杰伦"
# 加header是为了伪装为浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
res = requests.get(url, headers=headers)
print(res.text)
res.close()

 

成功拿到结果

将结果存到文件

import requests
url = "https://www.sogou.com/web?query=周杰伦"
# 加header是为了伪装为浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
f = open("sogou.html", "w", encoding="utf-8")
res = requests.get(url, headers=headers)
f.write(res.text)
f.close()
res.close()
print('ok')

百度翻译爬虫 

import requests
url = "https://fanyi.baidu.com/sug"
key = input('请输入要翻译的文字')
data = {"kw" : key
}
res = requests.post(url,data)
print(res.json())
res.close()

爬取豆瓣电影排名 

import requests
url = "https://movie.douban.com/j/chart/top_list"
data = {"type":"24","interval_id":"100:90","action":"","start":"0","limit":"20"
}
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
}
res = requests.get(url,params=data,headers=headers)
print(res.json())
res.close()

使用re解析数据

re介绍

import re# 返回所有匹配的值
list = re.findall(r'\d+', '我的电话号码10086,我女朋友电话号码10010')
print(list)
# 将匹配结果放到迭代器中
iter = re.finditer(r'\d+', '我的电话号码10086,我女朋友电话号码10010')
print(iter)
for i in iter:print(i)print(i.group())
# 查到一个就返回
search = re.search(r'\d+', '我的电话号码10086,我女朋友电话号码10010')
print(search)
print(search.group())
# 从头开始匹配,不会匹配到非头的部分
match = re.match(r'\d+', '10086,我女朋友电话号码10010')
print(match.group())# 预加载
obj = re.compile(r'\d+')
compile = obj.finditer('我的电话号码10086,我女朋友电话号码10010')
print(compile)# .* 贪婪匹配 尽可能多的匹配
# .*? 懒惰匹配 尽可能少的匹配
s = """
<div class='jay'><span id='1'>周杰伦</span></div>
<div class='jj'><span id='2'>李连杰</span></div>
<div class='aa'><span id='3'>刘亦菲</span></div>
<div class='weew'><span id='4'>刘涛</span></div>
"""
# (?P<wsss>.*?) 这个是把后面的.*?匹配上的字符串存到wsss这个组里
# (?P<分组名>正则) 可以从匹配结果中提取出对应分组的字符串
obj = re.compile(r"<div class='.*?'><span id='(?P<id>\d+)'>(?P<wsss>.*?)</span></div>", flags=re.S)  #re.S让.能匹配换行符
res = obj.finditer(s)
for i in res:print(i.group('id'))print(i.group('wsss'))

爬取豆瓣top250解析并存到csv文件

# 拿到源代码 requests
# 分析数据  re
import csv
import re
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/79.0.3945.88 Safari/537.36'
}
res = requests.get(url, headers=headers)
# re.S是让.可以匹配空格
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?'r'<div class="star">.*?<span class="rating_num" property="v:average">(?P<grade>.*?)</span>.*?'r'<span>(?P<num>.*?)人评价</span>', re.S)
list = obj.finditer(res.text)
f = open('douban.csv', 'w', encoding='utf-8')
writer = csv.writer(f)
for i in list:dic = i.groupdict()dic['name'] = dic['name'].strip()dic['grade'] = dic['grade'].strip()dic['num'] = dic['num'].strip()writer.writerow(dic.values())
f.close()
print('ok')

 爬取电影天堂比看热片下载地址

其中res.encoding='gb2312'是 设置响应编码 要和返回的html中的charset一致

# 获取电影天堂首页  查看必看热片
# 获取子页面数据
import requests
import re
domain = "https://www.dytt89.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
res = requests.get(domain, headers=headers,verify=False)
# 设置响应编码 要和返回的html中的charset一致
res.encoding='gb2312'
obj = re.compile(r'必看热片.*?<ul>.*?</ul>',re.S)
result = obj.search(res.text)
list = result.group()
obj2 = re.compile(r"<li><a href='(?P<url>.*?)'.*?>(?P<name>.*?)</a>",re.S)
res2 = obj2.finditer(list)
dic = []
f = open('movie.txt','w',encoding='utf-8')
f.write('片名     迅雷下载地址'+'\n')
for item in res2:dicItem = item.groupdict()dicItem['name'] = dicItem['name'].strip()dicItem['url'] = domain + dicItem['url']dic.append(dicItem)
for item in dic:res3 = requests.get(item['url'],headers=headers,verify=False)res3.encoding='gb2312'obj3 = re.compile(r'◎片  名(?P<name>.*?)<.*?<li><a href="(?P<url>.*?)"',re.S)res4 = obj3.finditer(res3.text)for item in res4:di = item.groupdict()di['name']=di['name'].strip()di['url']=di['url'].strip()f.write(di['name']+'  '+di['url']+'\n')
f.close()
print('ok')

使用bs4分析数据 

安装使用bs4

pip install bs4

测试1 

# 安装bs4 pip install bs4
from bs4 import BeautifulSoup
s = """
<div class='jay' id='sss'><span id='1'>周杰伦</span></div>
<div class='jj'><span id='2'>李连杰</span></div>
<div class='jj'><span id='3'>刘亦菲</span></div>
<div class='weew'><span id='4'>刘涛</span></div>
"""
page = BeautifulSoup(s, 'html.parser')
# find(标签名,属性名) 只找第一个
res0 = page.find('div',{'id':'sss'})
res1 = page.find('div',{'class':'jj'})
# find_all(标签名,属性名) 找全部
res2 = page.find_all('div',{'class':'jj'})print(res0.text)
print(res1.text)
print(res2)

 

测试2 

# 安装bs4 pip install bs4
from bs4 import BeautifulSoup
html= """
<table id='table1' class='aa'>
<tr><th>编号</th><th>姓名</th><th>职位</th><th>年龄</th><th>部门</th>
</tr>
<tr><td>003</td><td>王五</td><td>设计师</td><td>25</td><td>设计部</td>
</tr>
<tr><td>004</td><td>赵六</td><td>市场经理</td><td>35</td><td>市场部</td>
</tr>
</table>
<table id='table2' class='aa'><tr><th>编号</th><th>姓名</th><th>职位</th><th>年龄</th><th>部门</th></tr><tr><td>001</td><td>张三</td><td>软件工程师</td><td>28</td><td>技术部</td></tr><tr><td>002</td><td>李四</td><td>产品经理</td><td>32</td><td>产品部</td></tr>
</table>
"""
page = BeautifulSoup(html, 'html.parser')
# find(标签名,属性名) 只找第一个
res1 = page.find('table',{'class':'aa'})
# find_all(标签名,属性名) 找全部
res2 = page.find_all('table',{'class':'aa'})
# 下面切片从1开始,因为第一行是表头
trs = res1.find_all('tr')[1:]
for tr in trs:tds = tr.find_all('td')# 这边的.text是获取标签内的文本print([tds[0].text,tds[1].text,tds[2].text,tds[3].text,tds[4].text])

下载图片 

import requests
from bs4 import BeautifulSoup
url = 'https://wap.umei.cc/gaoxiaotupian/'
# 获取网页源码
res = requests.get(url)
res.encoding = 'utf-8'
page = BeautifulSoup(res.text, 'html.parser')
# 获取所有ul标签
ul = page.find('ul')
# 获取所有img标签
imgs = ul.find_all('img')
for img in imgs:# 获取图片地址# 这边两种取值方法都可以 img.get('data-original') 和 img['data-original']imgUrl = img.get('data-original')# print(img['data-original'])# 下载图片# 文件名fileName = imgUrl.split('/')[-1]with open('img/'+fileName, 'wb') as f:f.write(requests.get(imgUrl).content)print('下载图片:', fileName+'成功')
res.close()
print('下载完成')

使用lxml解析数据 

安装使用lxml

pip install lxml

 lxml是根据路径来获取数据的,可以使用 * 作为通配符,如果获取的结果是多个则多个都返回到结果中,其中/text()是获取标签内的值,//可以表示多个文件夹,例如/book//author/text()表示获取book下面所有的author标签的值,//author/text()这个表示获取标签中所有的author的值

from lxml import etree
xml= """
<book><name>编程之美</name><price>79.99</price><author>张伟</author><author>丽丽</author><div><author>傻傻</author></div><span><author>傻傻span</author></span><div><div><author>哈哈</author></div></div>
</book>
"""
book = etree.XML(xml)
# 根据路径来获取元素   text()是获取元素内的文本
name = book.xpath('/book/name/text()')
print(name)
# 匹配多个的时候会把所有的元素都返回
author = book.xpath('/book/author/text()')
print(author)
# 获取div下面的author元素
div_author = book.xpath('/book/div/author/text()')
print(div_author)
# 获取div下面的所有的author元素
div_all_author = book.xpath('/book/div//author/text()')
print(div_all_author)
# 获取book下所有的author元素
allbook_author = book.xpath('/book//author/text()')
print(allbook_author)
# 获取所有的author元素
all_author = book.xpath('//author/text()')
# 获取 傻傻 和 傻傻span  *是通配符
author_span = book.xpath('/book/*/author/text()')
print(author_span)

技巧

可以打开页面右键复制xpath,如果是相邻的可以复制然后微调

加载html文件

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>Title</title>
</head>
<body>
<ul><li><a href="111">text111</a></li><li><a href="222">text222</a></li><li><a href="333">text333</a></li>
</ul>
</body>
</html>
from lxml import etree
tree = etree.parse('a.html')
# 获取所有a标签的值
all_a = tree.xpath("/html/body/ul/li/a/text()")
print(all_a)
# 获取第一个a标签值 这边序号从1开始
first_a = tree.xpath("/html/body/ul/li[1]/a/text()")
print(first_a)
# 获取href属性值为333的a标签的
a_href_333 = tree.xpath("/html/body/ul/li/a[@href='333']/text()")
print(a_href_333)
# 获取所有a标签的href属性值
all_a_href = tree.xpath("/html/body/ul/li/a/@href")
print(all_a_href)
# 先获取所有的li标签,然后挨个获取a标签的值
all_li = tree.xpath("/html/body/ul/li")
for li in all_li:print(li.xpath("./a/text()"))

爬取图片

from lxml import etree
import requests
url = 'https://wap.umei.cc/gaoxiaotupian/'
# 获取网页源码
res = requests.get(url)
res.encoding = 'utf-8'
page = etree.HTML(res.text)
lis = page.xpath('/html/body/div[5]/ul/li')
for li in lis:img_url = li.xpath('./div/a/img/@data-original')[0]fileName = img_url.split('/')[-1]with open('img/'+fileName, 'wb') as f:f.write(requests.get(img_url).content)print('下载图片:', fileName+'成功')
res.close()
print('下载完成')

 

requests进阶

我们在之前的爬虫中其实已经使用过headers了.header为HTTP协议中的请求头,一般存放一些和请求内容无关的数据,有时也会存放一些安全验证信息.比如常见的User-Agent,token,cookie等.


通过requests发送的请求,我们可以把请求头信息放在headers中,也可以单独进行存放,最终由requests自动帮我们拼接成完整的http请求头.

待更新

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

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

相关文章

数据结十大排序之(冒泡,快排,并归)

接上期&#xff1a; 数据结十大排序之&#xff08;选排&#xff0c;希尔&#xff0c;插排&#xff0c;堆排&#xff09;-CSDN博客 前言&#xff1a; 在计算机科学中&#xff0c;排序算法是最基础且最重要的算法之一。无论是大规模数据处理还是日常的小型程序开发&#xff0c;…

游戏引擎学习第54天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体&#xff0c;这些实体位于玩家的视野中&#xff0c;频繁更新&#xff0c;而那些离玩家较远的实体则以较低的频率运…

网络安全漏洞挖掘之漏洞SSRF

SSRF简介 SSRF(Server-Side Request Forgery:服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连而与外…

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片

在计算机时代&#xff0c;我们依靠手机来捕捉和存储珍贵的回忆。但是&#xff0c;如果您不小心删除或丢失了手机上的照片怎么办&#xff1f;这真的很令人沮丧和烦恼&#xff0c;不是吗&#xff1f;好吧&#xff0c;如果您在 iPhone 上丢失了照片&#xff0c;您不必担心&#xf…

Linux高性能服务器编程 | 读书笔记 | 6. 高性能服务器程序框架

6. 高性能服务器程序框架 《Linux 高性能服务器编程》一书中&#xff0c;把这一章节作为全书的核心&#xff0c;同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后&#xff0c;正式进入了 Web 服务器项目的核心部分的学习 文章目录 6. 高性能服务器程序框架1.服…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

Xcode

info.plist Appearance Light 关闭黑暗模式 Bundle display name 设置app名称&#xff0c;默认为工程名 Location When In Use Usage Description 定位权限一共有3个key 1.Privacy - Location When In Use Usage Description 2.Privacy - Location Always and When In U…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

【Java 学习】:内部类详解

详谈Java内部类 &#x1f4c3;&#x1f4c3;本文将通过Java内部类 是什么&#xff0c;为什么被广泛使用&#xff0c;以及又该如何去使用这三个方面来详细讲解其相关知识。 文章目录 1. 内部类是什么 2. 为什么要使用内部类 3. 如何使用内部类 &#x1f349;成员内部类 &…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart

PyTorch3D 可视化

PyTorch3D是非常好用的3D工具库。但是PyTorch3D对于可用于debug&#xff08;例如调整cameras参数&#xff09;的可视化工具并没有进行系统的介绍。这篇文章主要是想介绍我觉得非常使用的PyTorch3D可视化工具。 1. 新建一个Mesh 从hugging face上下载一个glb文件&#xff0c;例…

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…

SM4笔记整理

文章目录 1. 介绍2. 算法定义3. 迭代运算3.1 轮函数F3.2 合成置换T 4. SM4秘钥生成4.1 具体步骤4.2 系统参数FK4.2 固定参数CK 5. 参考资料 以下内容为信息安全开发过程中&#xff0c;SM4对称加密算法的笔记。 对称加密算法汇总介绍&#xff1a;对称加密算法和模式 1. 介绍 …

如何使用Git or SVN--可视化工具

不会吧 现在还有人不会Git可视化工具 &#xff0c;作为一个从命令行转为可视化的开发者&#xff0c;深知这个可视化工具的重要性&#xff0c;之前在命令行去维护我们的工程是一个很头疼的事情 &#xff0c;后面也就有了可视化工具&#xff0c;市面上的工具的教程都不是很详细哥…

基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架

基于Clinical BERT的医疗知识图谱自动化构建方法&#xff0c;双层对比框架 论文大纲理解1. 确认目标2. 目标-手段分析3. 实现步骤4. 金手指分析 全流程核心模式核心模式提取压缩后的系统描述核心创新点 数据分析第一步&#xff1a;数据收集第二步&#xff1a;规律挖掘第三步&am…

《Time Ghost》的制作:使用 DOTS ECS 制作更为复杂的大型环境

*基于 Unity 6 引擎制作的 demo 《Time Ghost》 开始《Time Ghost》项目时的目标之一是提升在 Unity 中构建大型户外环境的构建标准。为了实现这一目标&#xff0c;我们要有处理更为复杂的场景的能力、有足够的工具支持&#xff0c;同时它对引擎的核心图形、光照、后处理、渲染…

华为大数据_unittest单元测试框架解析与应用

一、引言 随着软件开发的复杂度日益增加&#xff0c;单元测试在软件质量保证体系中扮演着越来越重要的角色。unittest作为Python的标准单元测试框架&#xff0c;以其简单、易用和强大的特性&#xff0c;受到了广大开发者的青睐。本文旨在深入解析unittest框架的核心原理&#…

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…