简介
Python爬虫,也称为网络爬虫或网页蜘蛛,是一种自动化脚本或程序,它利用Python编程语言来浏览万维网(World Wide Web),并自动地从网页中提取所需的数据。Python因其简洁的语法、丰富的库支持(如 requests、BeautifulSoup、Scrapy等)以及强大的数据处理能力,成为了构建爬虫应用的热门选择。
@ 特别声明 :Python爬虫为数据分析和挖掘提供了强大的工具,但也需要注意合法合规地使用爬虫技术尊重各大网站的权益和数据保护法规噢!!!
特点:
-
易学易用:Python的语法清晰简洁,即便是编程初学者也能较快上手,利用其构建爬虫。
-
丰富的库支持:Python拥有大量的第三方库,这些库大大简化了网络请求、HTML/XML解析、数据存储等任务。例如,requests库用于发送HTTP请求,BeautifulSoup和lxml库用于解析HTML/XML,pandas用于数据分析与存储。
-
跨平台性:Python编写的爬虫可以在Windows、Linux、macOS等多个操作系统上运行,提高了开发效率和兼容性。
-
高效的数据抓取与处理:通过并发和异步IO操作,Python爬虫能够高效地抓取大量数据,并利用Python强大的数据处理能力进行清洗、分析和存储。
-
广泛的应用场景:Python爬虫广泛应用于数据收集、市场分析、搜索引擎优化(SEO)、内容聚合、价格监控、学术研究等多个领域。
工作流程:
-
获取网页:基础技术上面已经讲过!这里我们说说进阶技术,分别有4个:多进程多线程抓取,登录抓取,图片ip封禁和使用服务器抓取!
-
发送请求:使用HTTP请求库(如requests)向目标网页发送请求,获取网页内容。
-
解析网页:使用HTML/XML解析库(如BeautifulSoup、lxml)解析网页内容,提取所需数据。当然也有进阶,就比如存入mysql和mongoDB数据库!
-
数据存储:将提取的数据保存到本地文件、数据库或云存储中。
-
异常处理:处理网络请求中的异常,如超时、连接错误等。
-
遵守规则:在编写爬虫时,要遵守robots.txt协议,避免对网站服务器造成不必要的负担或侵犯网站权益.
爬虫入门
基础知识
在这之前你应该了解过相关的python基础教程,就算是小白看完这篇文章你也可以去爬一起网站了
1.字符串(string)
string1='python web scraping'
string2='Q'
string3=string1+ " " + string2
printf (string3)
2.数字(Number)
int1=7
float1=4.4
trans_int=int(float1)
printf(trans_int)
3.列表(list)
list1=['python','web','scrappy']
list2=[1,2,3,45,]
list3=["a",2,"d",4]
4.字典(dictionaries)
namebook ={"knjw","qq","qb"}
pritf(namebook["knjw"]
printf(namebook)
5.条件语句和循环语句
book="python"
if book == "python":
printf("you are knjw.")
else:
printf("wrong.")
6.函数
def calulus (x): #def定义函数
y=x+1
return y
#调用函数
result = calulus(2)
printf(result)
7.封装
class person: #创建类
def_init_(self,name,age):
self.name=name
self.age=age
obj1 = Person('santos',20)
#讲santos和20分别封装到obj1及self的name和age属性
8.继承
打个比方:
猫可以:喵喵的叫,吃,喝,拉
老虎可以:喵叫,吃,喝,拉
class 猫:
def 喵喵叫(self):
printf('喵喵叫‘)
def 吃(self):
#do something
def 喝(self):
#do something
def 拉(self):
#do something
class 老虎:
def 喵叫(self):
printf('喵叫‘)
def 吃(self):
#do something
def 喝(self):
#do something
def 拉(self):
#do something
编写案例
建议:(1)实践才是王道,如果你打算看会就算看一百遍都没有上手实践来得快!!!
(2) 合理利用搜索引擎建议用谷歌浏览器多学学搜索语法,更加方便快捷
(3)别粘贴复制!!!粘贴和复制除了加快你的任务外,对你的编程能力毫无提升! 路都 是走出来的,大胆一些!!!!
1获取网页:
headers这里面是请求头的浏览器代理 ,摁F12或右击检查-点击网络 往下滑就看到了!
import requests #引用requests
link = " https://www.baidu.com/ " #选择网址
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
' (KHTML, like Gecko) '
'Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}
r= requests.get(link,headers=headers)
print(r.text) #这里是requests的response回复对象。
2.提取页面:
例如我提取网址里面a标签的元素//这里要注意的是你的“post-left"要跟你爬取页面一样。
#引用模块
import requests # 引用requests
from bs4 import BeautifulSoup
link = "https://www.gushiwen.cn/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
r = requests.get(link, headers=headers)
r.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(r.text, "html.parser")
title_element = soup.find("h1", class_="post-left")
print(r.text)
3.存储数据:
在原来的基础上加上两行代码就🆗!
with open('title.txt',"a+") as f: #title是文件名
f.write(title)
4.静态网站抓取
需下载requests:
import requests #引用
r = requests.get('https://www.gushiwen.cn/')
print("文本编码:",r.encoding) #表示服务器用的编码
print("响应状态码:", r.status_code) #以此类推
print("字符串方式的响应体",r.text)
5.设置超时实践
import requests
link="https://www.gushiwen.cn/"
r = requests.get(link,timeout=0.001)
6.实践爬取豆瓣电影top250
import requests
from bs4 import BeautifulSoup
def get_movie_names():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
for i in range(0, 10): # 假设我们只抓取前10页的电影
link = f'https://movie.douban.com/top250?start={i * 25}'
try:
response = requests.get(link, headers=headers, timeout=20)
response.raise_for_status() # 如果响应状态码不是200,将引发HTTPError异常
soup = BeautifulSoup(response.text, 'html.parser')
# 假设每个电影名字都包含在<span class="title">标签中,这可能需要您根据实际HTML调整
movie_titles = soup.find_all('span', class_='title')
for title in movie_titles:
# 清理并打印电影名字
print(title.get_text(strip=True))
except requests.exceptions.RequestException as e:
print(f"请求错误:{e}")
# 调用函数
get_movie_names()
7selenium爬取
#限制的作用在于爬取的时候,减少爬取的时间
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
# 创建 Firefox 配置选项
options = Options()
options.set_preference("permissions.default.stylesheet", 2) #stylesheet是限制css,image是限制图片。这里我就不一一举例了!
# 创建 WebDriver 实例,传入配置选项
driver = webdriver.Firefox(options=options)
# 打开网页
driver.get("输入你要浏览的地址")
# 在这里可以继续你的自动化操作
# 完成后关闭浏览器
driver.quit()
8BeautiflSoup解析
#正则表达式解析网页
三种方法:
re.match(从字符串起始位置匹配一个模式,如果从起始位置匹配不了,match()就返回none.
re.search(只能从字符串的起始位置进行匹配,而re.search扫描整个字符串并返回第一个成功的匹配)
re.findall(可以找到所有的匹配)
#使用BeautiflSoup解析网页
功能:
soup = BeautiflSoup(HTML,"lxml") #转换为BeautiflSoup对象
print(soup.prettif)对代码进行美化
#遍历文档树
soup.header.h1 爬取h1标签
soup.header.div.contents #对于某些标签的子节点
for child in soup.header.div.descendants:
print(child) #获取子子孙孙节点