首页 > 编程语言 >Python爬虫入门

Python爬虫入门

时间:2024-03-15 11:01:39浏览次数:30  
标签:匹配 入门 Python driver 爬虫 soup print find

什么是爬虫

爬虫就是程序,一个能获取互联网上的资源(文字、图片、音视频)数据的程序。
不用爬⾍, 打开浏览器, 输⼊百度的⽹址,就能在浏览器上看到百度的内容了。那换成爬⾍呢? 道理是⼀样的。只不过,是⽤代码来模拟⼀个浏览器, 然后同样的输⼊百度的⽹址。那么程序也能拿到百度的内容

爬虫合法吗

爬虫在法律上暂时是不被禁止的。但服务器上的数据有产权归属,如果网络爬虫获取数据后牟利将带来法律风险。小规模,数据量小,频率不高, 不窃取用户隐私的爬取是可以的,合法的

反爬与反反爬

反爬机制:网站可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取
反反爬策略:爬虫程序可以通过制定相关的策略或者技术手段,破解网站中具备的反爬机制,从而可以获取网站中相关的数据。
robots.txt协议:君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取

requests请求库

  • 安装
pip install requests
  • 请求百度首页源代码
import requests

# 这样运行的话就把百度首页的html提取出来了
url = "https://www.baidu.com/"
response = requests.get(url)
response.encoding = "utf-8"
print(response.text)

XPath解析库

  • ⼤多数情况下, 我们并不需要整个⽹⻚的内容, 只是需要那么⼀⼩部分。所以我们要做数据解析和提取。常见的有:xpath解析、BeautifulSoup解析、正则表达式re解析
  • XPath是⼀⻔在 XML ⽂档中查找信息的语⾔, XPath可⽤来在 XML⽂档中对元素和属性进⾏遍历,⽽我们熟知的HTML恰巧属于XML的⼀个⼦集,所以完全可以⽤xpath去查找html中的内容
  • 在python中想要使⽤xpath,需要安装lxml模块:pip install lxml
  • 基础用法:①将要解析的html内容构造出etree对象②使⽤etree对象的xpath()⽅法配合xpath表达式来完成对数据的提取
html = """
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Title</title>
    </head>
    <body>
        <ul>
            <li><a href="http://www.baidu.com">百度
            </a></li>
            <li><a href="http://www.google.com">⾕
            歌</a></li>
            <li><a href="http://www.sogou.com">搜狗
            </a></li>
        </ul>
        <ol>
            <li><a href="feiji">⻜机</a></li>
            <li><a href="dapao">⼤炮</a></li>
            <li><a href="huoche">⽕⻋</a></li>
        </ol>
        <div>李嘉诚</div>
        <div>胡辣汤</div>
    </body>
</html>
"""
from lxml import etree

tree = etree.XML(html)
result = tree.xpath("/html/body/ul/li/a/@href")
print(result)

result = tree.xpath("/html/body/ul/li")
for li in result:
    print(li.xpath("./a/@href"))

result = tree.xpath("/html/body/ol/li/a/@href")
print(result)

BeautifulSoup解析库

  • 安装库:pip intall bs4
<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>测试bs4</title>
</head>
<body>
	<div>
		<p>百里守约</p>
	</div>
	<div class="song">
		<p>李清照</p>
		<p>王安石</p>
		<p>苏轼</p>
		<p>柳宗元</p>
		<a href="http://www.song.com/" title="赵匡胤" target="_self">
			<span>this is span</span>
		宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
		<a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
		<img src="http://www.baidu.com/meinv.jpg" alt="" />
	</div>
	<div class="tang">
		<ul>
			<li><a href="百度一下,你就知道" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li>
			<li><a href="网易" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li>
			<li><a href="126网易免费邮--你的专业电子邮" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
			<li><a href="home.sina.com" class="du">杜甫</a></li>
			<li><a href="Awesome Coming Soon Widget Responsive Widget" class="du">杜牧</a></li>
			<li><b>杜小月</b></li>
			<li><i>度蜜月</i></li>
			<li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
		</ul>
	</div>
</body>
</html>

from bs4 import BeautifulSoup

#本地的html
fp = open(r"test.html","r",encoding="utf-8")
soup = BeautifulSoup(fp,"lxml")
print(soup)  #返回这个网页的源代码
print(soup.a)  #返回第一个a标签的内容
print(soup.div) #返回第一个div 的内容
print(soup.find("div"))  #返回第一个div 的内容
print(soup.find("div",class_="song"))   #返回class = "song" 的div的内容
print(soup.find_all("a"))  #返回所有a标签的内容
print(soup.find("div",class_="song").a.get("href"))# 返回http://www.song.com/
print(soup.find("div",class_="song").img.get("src"))#返回http://www.baidu.com/meinv.jpg
print(soup.find("div",class_="song").a.text) # 返回文本
print(soup.select('.tang'))   返回class = "tang" 的div的内容
print(soup.select(".tang > ul > li > a")[0].text)   # 返回tang下的第一个标签的内容
print(soup.select(".tang > ul > li > a")[0]['href']) # 返回tang下的第一个标签的链接

正则表达式

  • 正则表达式是用来简洁表达一组字符串的表达式
    在这里插入图片描述
import re
# 将正则表达式编译成为⼀个正则表达式对象, 规则要匹配的是3个数字
obj = re.compile(r'\d{3}')
# 正则表达式对象调⽤search, 参数为待匹配的字符串
ret = obj.search('abc123eeee')
print(ret.group()) # 结果: 123

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

. 匹配除换⾏符以外的任意字符
\w 匹配字⺟或数字或下划线
\s 匹配任意的空⽩符 \d 匹配数字
\n 匹配⼀个换⾏符
\t 匹配⼀个制表符
^ 匹配字符串的开始 $ 匹配字符串的结尾
\W 匹配⾮字⺟或数字或下划线
\D 匹配⾮数字
\S 匹配⾮空⽩符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示⼀个组
[…] 匹配字符组中的字符
[^…] 匹配除了字符组中字符的所有字符

量词: 控制前⾯的元字符出现的次数

*重复零次或更多次
+重复⼀次或更多次
? 重复零次或⼀次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

贪婪匹配和惰性匹配

str: 玩⼉吃鸡游戏, 晚上⼀起上游戏, ⼲嘛呢? 打游戏啊
reg: 玩⼉.*?游戏
此时匹配的是: 玩⼉吃鸡游戏
reg: 玩⼉.*游戏
此时匹配的是: 玩⼉吃鸡游戏, 晚上⼀起上游戏, ⼲嘛呢? 打游戏

str: <div>胡辣汤</div>
reg: <.*>
结果: <div>胡辣汤</div>

str: <div>胡辣汤</div>
reg: <.*?>
结果:
<div>
</div>

str: <div>胡辣汤</div><span>饭团</span>
reg: <div>.*?</div>
结果:
<div>胡辣汤</div>
  • 案例:练习用正则表达式提取豆瓣电影top250的数据并保存
# 拿到页面源代码.   requests
# 通过re来提取想要的有效信息  re
import requests
import re
import csv

url = "https://movie.douban.com/top250"
headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36"
}
resp = requests.get(url, headers=headers)
page_content = resp.text

# 解析数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
                 r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?<span '
                 r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
                 r'<span>(?P<num>.*?)人评价</span>', re.S)
# 开始匹配
result = obj.finditer(page_content)
f = open("data.csv", mode="w")
csvwriter = csv.writer(f)
for it in result:
    print(it.group("name"))
    print(it.group("score"))
    print(it.group("num"))
    print(it.group("year").strip())
    dic = it.groupdict()
    dic['year'] = dic['year'].strip()
    csvwriter.writerow(dic.values())

f.close()
print("over!")

cookies:处理需要登陆的网站

headers为HTTP协议中的请求头。⼀般存放⼀些和请求内容⽆关的数据。有时也会存放⼀些安全验证信息,比如常⻅的User-Agent,cookies等。通过requests发送的请求, 我们可以把请求头信息放在headers中。也可以单独进⾏存放, 最终由requests⾃动帮我们拼接成完整的http请求头

selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接调用浏览器,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等

  • 在下载好chromedriver以及安装好selenium模块后,可以执行下列代码并观察运行的过程
from selenium import webdriver 
# 如果driver没有添加到了环境变量,则需要将driver的绝对路径赋值给executable_path参数
# driver = webdriver.Chrome(executable_path='driver的绝对路径')

# 如果driver添加了环境变量则不需要设置executable_path
driver = webdriver.Chrome()
# 向一个url发起请求
driver.get("https://www.baidu.com/")
# 把网页保存为图片
driver.save_screenshot("baidu.png")
# 打印页面的标题
print(driver.title) 
# 在百度搜索框中搜索'python'
driver.find_element_by_id('kw').send_keys('python')
# 点击'百度搜索'
driver.find_element_by_id('su').click()
# 退出模拟浏览器
driver.quit()
  • selenium工作原理:利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)
  • 在selenium中可以通过多种方式来定位标签,返回标签元素对象
find_element_by_id                         (返回一个元素)
find_element(s)_by_class_name             (根据类名获取元素列表)
find_element(s)_by_name                 (根据标签的name属性值返回包含标签对象元素的列表)
find_element(s)_by_xpath                 (返回一个包含元素的列表)
find_element(s)_by_link_text             (根据连接文本获取元素列表)
find_element(s)_by_partial_link_text     (根据链接包含的文本获取元素列表)
find_element(s)_by_tag_name             (根据标签名获取元素列表)
find_element(s)_by_css_selector         (根据css选择器来获取元素列表)
  • selenium获取cookie:driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用的话,需要转换为name、value作为键值对的cookie字典
# 获取当前标签页的全部cookie信息
print(driver.get_cookies())
# 把cookie转化为字典
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
  • selenium控制浏览器执行js代码
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.itcast.cn/")
time.sleep(1)

js = 'window.scrollTo(0,document.body.scrollHeight)' # js语句
driver.execute_script(js) # 执行js的方法 跳转到最底部

time.sleep(5)
driver.quit()

scrapy框架

  • Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架
    在这里插入图片描述
  • scrapy的架构如下图,图中中文是为了方便理解后加上去的。图中绿色线条的表示数据的传递。注意图中中间件的位置,决定了其作用。注意其中引擎的位置,所有的模块之前相互独立,只和引擎进行交互
    在这里插入图片描述
  • 爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器
  • 调度器把request–>引擎–>下载中间件—>下载器
  • 下载器发送请求,获取response响应---->下载中间件---->引擎—>爬虫中间件—>爬虫
  • 爬虫提取url地址,组装成request对象---->爬虫中间件—>引擎—>调度器,重复步骤2
  • 爬虫提取数据—>引擎—>管道处理和保存数据

scrapy的三个内置对象

  • request请求对象:由url method post_data headers等构成
  • response响应对象:由url body status headers等构成
  • item数据对象:本质是个字典

scrapy中每个模块的具体作用
在这里插入图片描述

标签:匹配,入门,Python,driver,爬虫,soup,print,find
From: https://blog.csdn.net/Listennnn/article/details/136661430

相关文章

  • 使用Python开发桌面应用程序
    前言在本教程中,我们将使用Python编写一个功能强大的桌面应用程序,用于数据清洗、压缩、合并excel文件。该程序基于PySide6库和其他辅助库进行开发,提供了直观的用户界面和易于使用的功能。下面我们将对代码进行分块介绍。(底部附项目完整代码)导入所需库和模块在程序的开头,我们......
  • Android NDK入门:在应用中加入C和C++的力量
    目录​编辑引NDK的设计目的与Java/Kotlin的结合使用场景开发流程设置项目以支持NDK编写本地代码使用JNI连接本地代码和Java/Kotlin代码编译和运行你的应用附 引自诩方向是android方向的移动端开发工程师,却从来没有真正仔细了解过NDK,这里就详细的整理了解一下n......
  • python+django在线网络小说分享系统flask毕业设计
    小说网站完善了对应的软体架设以及程序编码的工作,采取Mysql作为后台数据的主要存储单元,采用vue框架等技术进行业务系统的编码及其开发,实现了本系统的全部功能。同时完成小说网站的基本功能:小说的分类、信息查询浏览时间排行;用户的注册登录、创作小说、对阅读书架的管理;后台对用......
  • 图书推荐|MySQL 8.0从入门到实战
    MySQL数据库从入门到实战,全面掌握MySQL的使用技能和解决实际问题的能力!本书简介MySQL数据库是目前全球流行的数据库之一。《MySQL8.0从入门到实战》从入门到实战,系统全面、由浅入深地介绍MySQL数据库应用的各个方面。全书分为8个部分,共18章。第1部分(第1~3章)介绍MySQL的基......
  • python+playwright 以非無痕模式打开chrome浏览器
    在使用python+playwright想从网页下载Excel数据,因为需要经过SSO,携带Tokey才可以访问数据,所以无痕模式下搞不好,使用非无痕模式打开浏览器,就可以获取cookie,成功达到效果。点击查看代码frommultiprocessing.sharedctypesimportValuefromplaywright.sync_apiimportsync_pla......
  • 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧
    很多人都听说过爬虫,我也不例外。曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大。因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容。广告?不存在的,因为我看不见。爬虫只会获取我感兴趣的信息,不需要的内容对我而言只是一......
  • 多目标优化算法快速入门
    多目标优化快速入门前言​ 多目标优化算法是一种用于同时考虑多个目标函数的优化算法。它与单目标优化算法的不同之处在于,多目标优化算法需要同时兼顾多个目标,并在保证每个目标的一定程度满足的前提下尽可能使得每个目标的满足程度都达到最优。多目标优化算法通常应有于解决冲......
  • 掌握Python库的Bokeh,就能让你的交互炫目可视化
    本文分享自华为云社区《Bokeh图形魔法:掌握绘图基础与高级技巧,定制炫目可视化》,作者:柠檬味拥抱。Bokeh是一个用于创建交互式可视化图形的强大Python库。它不仅易于使用,而且功能强大,适用于各种数据可视化需求。本文将介绍Bokeh库的绘图可视化基础入门,重点说明常用的参数,并通过实例......
  • python的字符串方法举例
    Python中的字符串对象提供了许多内置的方法,用于操作和处理字符串。以下是一些常用的字符串方法及其示例:1.split()将字符串分割为子字符串列表,并返回该列表。s="HelloWorld"words=s.split()#默认按空格分割print(words)#输出:['Hello','World']#也可以指定分......
  • c3p0 数据池入门使用教程
    dbcp系列从零开始手写mybatis(三)jdbcpool如何从零手写实现数据库连接池dbcp?万字长文深入浅出数据库连接池HikariCP/CommonsDBCP/Tomcat/c3p0/druid对比DatabaseConnectionPool数据库连接池概览c3p0数据池入门使用教程alibabadruid入门介绍数据库连接池Hikari......