python_爬虫基础
python爬虫基础
1、初识爬虫
1.rebots协议
网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,但它仅仅是互联网中的约定而已,可以不用遵守。例如:https://www.taobao.com/robots.txt
2.谷歌浏览器插件
● XPath Helper
● Web Scraper
● Toggle JavaScript
● User-Agent Switcher for Chrome
● EditThisCookie
● SwitchySharp
插件下载地址:
- https://extfans.com/
- https://chrome.zzzmh.cn/#/index
安装步骤:
1、在应用商店下载好插件后解压缩,直接拖进去就可以啦:
3.requests发送网络请求以及常用属性
需求:通过requests向百度首页发送请求,获取百度首页数据
import requests url = "https://www.baidu.com" response = requests.get(url=url) print("---状态码如下---") print(response.status_code) print("---bytes类型数据:---") print(response.content) print("---str类型数据---") print(response.text) print("---str类型数据(utf-8)---") print(response.content.decode("utf-8"))
常用属性如下:
● response.text 响应体str类型
● respones.content 响应体bytes类型
● response.status_code 响应状态码
● response.request.headers 响应对应的请求头
● response.headers 响应头
● response.request.headers.get('cookies') 响应对应请求的cookie
● response.cookies 响应的cookie(经过了set-cookie动作)
● response.url请求的URL
4、iter_content方法
如果下载一个较大的资源,例如一个视频,可能需要的下载时间较长,在这个较长的下载过程中程序是不能做别的事情的(当然可以使用多任务来解决),如果在不是多任务的情况下,想要知道下载的进度,此时就可以通过类似迭代的方式下载部分资源。
使用iter_content
r = requests.get('https://www.baidu.com', stream=True) with open('test.html', 'wb') as f: for chunk in r.iter_content(chunk_size=100): f.write(chunk)
在获取数据时,设置属性stream=True
● 如果设置了stream=True,那么在调用iter_content方法时才会真正下载内容
● 如果没设置stream属性则调用requests.get就会耗费时间下载
5、重定向与历史请求
思考:为什么打印出来的url不是请求的url呢?
想要搞清楚这个问题,就要知道requests的重定向问题。
requersts的默认情况
默认情况下,requests发送的请求除了方式为HEAD之外,其余的请求例如GET、POST等都是能自动进行重 定向的
这也就是为什么上面明明访问的是http://www.baidu.com而打印出来之后是https://m.baidu.com/?from=844b&vit=fps的原因
取消自动重定向
在发送请求的时候,可以通过如下的设置,取消requests模块的自动重定向功能
requests.get(url, allow_redirects=False)
6、SSL证书问题
在浏览网页时,可能会遇到以下这种情况:
出现这个问题的原因是:ssl证书不安全导致的。
7、retrying模块的使用
使用超时参数能够加快我们整体的运行速度。但是在普通的生活中当我们使用浏览器访问网页时,如果发生速度很慢的情况,我们会做的选择是刷新页面。那么在代码中,我们是否也可以刷新请求呢?
在本小节中我们使用retrying模块来完成需求。
# 安装指令如下: pip install retrying -i https://pypi.tuna.tsinghua.edu.cn/simple
作用:
- 使用retrying模块提供的retry模块
- 通过装饰器的方式使用,让被装饰的函数反复执行
- retry中可以传入参数stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行
import requests from retrying import retry num = 1 @retry(stop_max_attempt_number=3) def _parse_url(url): global num print("第%d次尝试" % num) num += 1 headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1" } # 超时的时候会报错并重试 response = requests.get(url, headers=headers, timeout=3) # 状态码不是200,也会报错并重试 assert response.status_code == 200 # 此语句是"断言",如果assert后面的条件为True则呈现继续运行,否则抛出异常 return response def parse_url(url): # 进行异常捕获 try: response = _parse_url(url) except Exception as e: print("产生异常:", e) # 报错返回None response = None return response if __name__ == '__main__': url = "https://chinasoftinc.com/owa" # url = "https://www.baidu.com" print("----开始----") r = parse_url(url=url) print("----结束----", "响应内容为:", r)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?