Python进阶之爬虫


什么是爬虫:通过编写程序,模拟浏览器行为,然后让其去互联网抓取数据的过程。

请求和响应

请求:
	请求行:请求方式 请求url地址 请求协议
	请求头:放一些服务器要使用的附加信息(user-Agent之类的)
	请求体:请求参数(post请求)

响应:
	响应行:协议 状态码
	响应头:放一些客户端要使用的附加信息(cookie之类的)
	响应体:服务器返回内容(json、Html)给客户端

一、爬取百度页面

# urllib包下的request模块
from urllib.request import urlopen
url = 'http://www.baidu.com'
resp = urlopen(url)
# print(resp)   # <http.client.HTTPResponse object at 0x00000170B3AADA50>
# print(resp.read().decode("utf-8"))
with open(file="baidu.html", mode='w', encoding='utf-8') as fp:
    fp.write(resp.read().decode('utf-8'))
# byte.decode()  # 将字节码解码字符串
# str.encode() # 将字符串编码字节码

requests 模块

安装

可以直接在控制台输入 pip install requests

# pip install requests

下载速度过慢的话,可以通过镜像源安装

# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
# 利用国内镜像源下载库
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

清华镜像源地址

get 请求

import requests
keyword = input("请输入你想搜索的关键词:")
url = f"https://www.sogou.com/web?query={keyword}"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54 "
}
resp = requests.get(url, headers=header)
print(resp)  # <Response [200]>
print(resp.status_code)  # 200
print(resp.text)
with open(file=f"{keyword}.html", mode='w', encoding='utf-8') as fp:
    fp.write(resp.text)  # 页面源代码
resp.close()  # 关闭resp

Post 请求
在这里插入图片描述

import requests
url = 'https://fanyi.baidu.com/sug'
# 请求体参数
data = {
    'kw': 'dog'
}
resp = requests.post(url, data=data)
print(resp.json())
print(resp.json()['data'][0]['v'])
# {'errno': 0, 'data': [{'k': 'dog', 'v': 'n. 狗; 蹩脚货; 丑女人; 卑鄙小人 v. 困扰; 跟踪'}, {'k': 'DOG', 'v': 'abbr. Data Output Gate 数据输出门'}, {'k': 'doge', 'v': 'n. 共和国总督'}, {'k': 'dogm', 'v': 'abbr. dogmatic 教条的; 独断的; dogmatism 教条主义; dogmatist'}, {'k': 'Dogo', 'v': '[地名] [马里、尼日尔、乍得] 多戈; [地名] [韩国] 道高'}]}
# n. 狗; 蹩脚货; 丑女人; 卑鄙小人 v. 困扰; 跟踪

当 get 请求参数过长,可以用另一种方式封装参数。

豆瓣地址

import requests
url = 'https://movie.douban.com/j/chart/top_list?'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 '
                  'Safari/537.36 '
}
# get 请求参数
params = {
    'type': 24,
    'interval_id': '100:90',
    'action': '',
    'start': 0,
    'limit': 20
}
resp = requests.get(url, params, headers=headers)
print(resp.request.url)
print(resp.json())

数据解析

我们已经实现了从互联网上爬取网页数据,但是怎么从这诺大的网页中获取到真正想要的数据,这就需要用到正则表达式了。

正则表达式

正则表达式(Regular Expression),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

测试正则表达式地址

元字符:具有固定含义的特殊字符

.  匹配除\n以外的任何字符
\w 匹配数字、字母或下划线 相当于[0-9a-zA-Z_]
\s 匹配任意的空白符
\d 匹配单个数字字符 相当于[0-9]

\n 匹配一个换行符

# 表单验证用处大
^ 指定起始字符
$ 指定结束字符

\W 匹配非数字、字母或下划线
\S 匹配非空白符
\D 匹配非数字
| 或者
[] 匹配字符组中的字符 实例:[happy]  匹配 h、a、p、p、y中的任意一个字符
- 连字符  实例:[A-Z]  匹配 A-Z任意一个大写字母
[^...] 匹配除了字符组以外的所有字符

量词:用于指定其前面的字符出现多少次

* 指定字符重复 0 或 多次
+ 指定字符重复 1 或 多次
? 指定字符重复 01{n} 指定字符重复n次
{n,} 指定字符重复至少n次
{n,m} 指定字符重复 n 到 m 次

贪婪匹配和惰性匹配

贪婪匹配 .* 
惰性匹配  .*?

惰性匹配
贪婪匹配

re模块

菜鸟教程

import re
# 贪婪匹配 .*    惰性匹配  .*?
# def findall(pattern, string, flags=0):
# findall:匹配字符串中所有符合正则的内容,并以列表的方式返回。
match_list = re.findall(pattern=r"\d+", string="123abc456")
print(match_list)  

# def finditer(pattern, string, flags=0):
# finditer:返回迭代器
match_iter = re.finditer(pattern=r"\d+", string="123abc456")
print(match_iter)
for iter_one in match_iter:
    print(iter_one.group())

# def search(pattern, string, flags=0):
# search:匹配一次,返回match对象
match_search = re.search(pattern=r"\d+", string="123abc456")
print(match_search)
print(match_search.group())


# def match(pattern, string, flags=0):
# match:从头开始匹配,返回 match对象
match_match = re.match(pattern=r"\d+", string="123abc456")
print(match_match.group())


# 预加载正则表达式
obj = re.compile(r"\d+")
res = obj.finditer(string="123abc456")
for iter_two in res:
    print(iter_two.group())

输出结果:
['123', '456']
<callable_iterator object at 0x0000022CCE1D7C40>
123
456
<re.Match object; span=(0, 3), match='123'>
123
123
123
456
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python爬虫涉及到一些高级技术和技巧,以下是一些你可以学习和探索的主题: 1. 多线程和多程:使用多线程或多程可以提高爬虫的效率,同时处理多个请求或任务。 2. 使用代理:在爬取网页时,你可能会被网站封禁IP,使用代理可以轮流切换IP地址来规避封禁。 3. 反反爬虫策略:有些网站会采取一些手段防止爬虫,你需要学习如何识别和应对这些策略,比如验证码、页面解密等。 4. 使用Cookie和Session:有些网站会使用Cookie和Session来验证用户身份,你需要学习如何在爬虫中模拟登录和保持会话状态。 5. 使用数据库:将爬取到的数据存储到数据库中可以方便后续的数据分析和处理。 6. 使用框架和库:学习使用一些流行的爬虫框架和库,比如Scrapy、BeautifulSoup、Requests等,可以大大简化爬虫的开发和管理。 7. 高级数据解析和提取:学习使用正则表达式、XPath、CSS选择器等高级技术来解析和提取网页中的数据。 8. 动态网页爬取:学习使用Selenium等工具来爬取动态生成的网页内容,比如通过JavaScript异步加载的数据。 9. 分布式爬虫:学习如何构建分布式爬虫系统,可以提高爬取效率和可靠性。 10. 爬虫的合法性和道德问题:学习了解相关法律法规和伦理道德,确保你的爬虫行为合法合规。 这些都是Python爬虫的一些方向,你可以根据自己的兴趣和需求选择学习的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数产第一混子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值