Python爬虫入门教程!手把手教会你爬取网页数据

Python爬虫入门教程!手把手教会你爬取网页数据

2023年6月29日发(作者:)

Python爬⾍⼊门教程!⼿把⼿教会你爬取⽹页数据其实在当今社会,⽹络上充斥着⼤量有⽤的数据,我们只需要耐⼼的观察,再加上⼀些技术⼿段,就可以获取到⼤量的有价值数据。这⾥的“技术⼿段”就是⽹络爬⾍。今天就给⼤家分享⼀篇爬⾍基础知识和⼊门教程:什么是爬⾍?爬⾍就是⾃动获取⽹页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运⾏着庞⼤的爬⾍系统,从全世界的⽹站中爬⾍数据,供⽤户检索时使⽤。爬⾍流程其实把⽹络爬⾍抽象开来看,它⽆外乎包含如下⼏个步骤模拟请求⽹页。模拟浏览器,打开⽬标⽹站。获取数据。打开⽹站之后,就可以⾃动化的获取我们所需要的⽹站数据。保存数据。拿到数据之后,需要持久化到本地⽂件或者数据库等存储设备中。那么我们该如何使⽤ Python 来编写⾃⼰的爬⾍程序呢,在这⾥我要重点介绍⼀个 Python 库:Requests。Requests 使⽤Requests 库是 Python 中发起 HTTP 请求的库,使⽤⾮常⽅便简单。模拟发送 HTTP 请求发送 GET 请求当我们⽤浏览器打开⾖瓣⾸页时,其实发送的最原始的请求就是 GET 请求import requestsres = ('')print(res)print(type(res))>>>可以看到,我们得到的是⼀个 Response 对象如果我们要获取⽹站返回的数据,可以使⽤ text 或者 content 属性来获取text:是以字符串的形式返回数据content:是以⼆进制的⽅式返回数据print(type())print()>>> .....发送 POST 请求对于 POST 请求,⼀般就是提交⼀个表单r = ('', data={"key": "value"})data 当中,就是需要传递的表单信息,是⼀个字典类型的数据。header 增强对于有些⽹站,会拒绝掉没有携带 header 的请求的,所以需要做⼀些 header 增强。⽐如:UA,Cookie,host 等等信息。header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36", "Cookie": "your cookie"}res = ('', headers=header)解析 HTML现在我们已经获取到了⽹页返回的数据,即 HTML 代码,下⾯就需要解析 HTML,来提取其中有效的信息。BeautifulSoupBeautifulSoup 是 Python 的⼀个库,最主要的功能是从⽹页解析数据。from bs4 import BeautifulSoup # 导⼊ BeautifulSoup 的⽅法# 可以传⼊⼀段字符串,或者传⼊⼀个⽂件句柄。⼀般都会先⽤ requests 库获取⽹页内容,然后使⽤ soup 解析。soup = BeautifulSoup(html_doc,'') # 这⾥⼀定要指定解析器,可以使⽤默认的 html,也可以使⽤ lxml。print(fy()) # 按照标准的缩进格式输出获取的 soup 内容。BeautifulSoup 的⼀些简单⽤法print() # 获取⽂档的 titleprint() # 获取 title 的 name 属性print() # 获取 title 的内容print(soup.p) # 获取⽂档中第⼀个 p 节点print(soup.p['class']) # 获取第⼀个 p 节点的 class 内容print(_all('a')) # 获取⽂档中所有的 a 节点,返回⼀个 listprint(_all('span', attrs={'style': "color:#ff0000"})) # 获取⽂档中所有的 span 且 style 符合规则的节点,返回⼀个 list具体的⽤法和效果,我会在后⾯的实战中详细说明。XPath 定位XPath 是 XML 的路径语⾔,是通过元素和属性进⾏导航定位的。⼏种常⽤的表达式表达式含义node选择 node 节点的所有⼦节点/从根节点选取//选取所有当前节点.当前节点..⽗节点@属性选取text()当前路径下的⽂本内容⼀些简单的例⼦xpath('node') # 选取 node 节点的所有⼦节点xpath('/div') # 从根节点上选取 div 元素xpath('//div') # 选取所有 div 元素xpath('./div') # 选取当前节点下的 div 元素xpath('//@id') # 选取所有 id 属性的节点当然,XPath ⾮常强⼤,但是语法也相对复杂,不过我们可以通过 Chrome 的开发者⼯具来快速定位到元素的 xpath,如下图 得到的 xpath 为//*[@id="anony-nav"]/div[1]/ul/li[1]/a在实际的使⽤过程中,到底使⽤ BeautifulSoup 还是 XPath,完全取决于个⼈喜好,哪个⽤起来更加熟练⽅便,就使⽤哪个。爬⾍实战:爬取⾖瓣海报我们可以从⾖瓣影⼈页,进⼊都影⼈对应的影⼈图⽚页⾯,⽐如以刘涛为例⼦,她的影⼈图⽚页⾯地址为/celebrity/1011562/photos/ 下⾯我们就来分析下这个⽹页很多⼈学习python,不知道从何学起。很多⼈学习python,掌握了基本语法过后,不知道在哪⾥寻找案例上⼿。很多已经做案例的⼈,却不知道如何去学习更加⾼深的知识。那么针对这三类⼈,我给⼤家提供⼀个好的学习平台,免费领取视频教程,电⼦书籍,以及课程的源代码!QQ群:721195303⽬标⽹站页⾯分析注意:⽹络上的⽹站页⾯构成总是会变化的,所以这⾥你需要学会分析的⽅法,以此类推到其他⽹站。正所谓授⼈以鱼不如授⼈以渔,就是这个原因。Chrome 开发者⼯具Chrome 开发者⼯具(按 F12 打开),是分析⽹页的绝佳利器,⼀定要好好使⽤。我们在任意⼀张图⽚上右击⿏标,选择“检查”,可以看到同样打开了“开发者⼯具”,⽽且⾃动定位到了该图⽚所在的位置 可以清晰的看到,每张图⽚都是保存在 li 标签中的,图⽚的地址保存在 li 标签中的 img 中。知道了这些规律后,我们就可以通过 BeautifulSoup 或者 XPath 来解析 HTML 页⾯,从⽽获取其中的图⽚地址。代码编写我们只需要短短的⼏⾏代码,就能完成图⽚ url 的提取import requestsfrom bs4 import BeautifulSoup

url = '/celebrity/1011562/photos/'res = (url).textcontent = BeautifulSoup(res, "")data = _all('div', attrs={'class': 'cover'})picture_list = []for d in data: plist = ('img')['src'] picture_(plist)print(picture_list)>>>['/view/photo/m/public/', '/view/photo/m/public/', '可以看到,是⾮常⼲净的列表,⾥⾯存储了海报地址。但是这⾥也只是⼀页海报的数据,我们观察页⾯发现它有好多分页,如何处理分页呢。

分页处理我们点击第⼆页,看看浏览器 url 的变化/celebrity/1011562/photos/?type=C&start=30&sortby=like&size=a&subtype=a发现浏览器 url 增加了⼏个参数再点击第三页,继续观察 url/celebrity/1011562/photos/?type=C&start=60&sortby=like&size=a&subtype=a通过观察可知,这⾥的参数,只有 start 是变化的,即为变量,其余参数都可以按照常理来处理同时还可以知道,这个 start 参数应该是起到了类似于 page 的作⽤,start = 30 是第⼆页,start = 60 是第三页,依次类推,最后⼀页是 start = 420。于是我们处理分页的代码也呼之欲出了⾸先将上⾯处理 HTML 页⾯的代码封装成函数def get_poster_url(res): content = BeautifulSoup(res, "") data = _all('div', attrs={'class': 'cover'}) picture_list = [] for d in data: plist = ('img')['src'] picture_(plist) return picture_list然后我们在另⼀个函数中处理分页和调⽤上⾯的函数def fire(): page = 0 for i in range(0, 450, 30): print("开始爬取第 %s 页" % page) url = '/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) res = (url).text data = get_poster_url(res) page += 1此时,我们所有的海报数据都保存在了 data 变量中,现在就需要⼀个下载器来保存海报了def download_picture(pic_l): if not (r'picture'): (r'picture') for i in pic_l: pic = (i) p_name = ('/')[7] with open('picture' + p_name, 'wb') as f: (t)再增加下载器到 fire 函数,此时为了不是请求过于频繁⽽影响⾖瓣⽹的正常访问,设置 sleep time 为1秒def fire(): page = 0 for i in range(0, 450, 30): print("开始爬取第 %s 页" % page) url = '/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) res = (url).text data = get_poster_url(res) download_picture(data) page += 1 (1)下⾯就执⾏ fire 函数,等待程序运⾏完成后,当前⽬录下会⽣成⼀个 picture 的⽂件夹,⾥⾯保存了我们下载的所有海报

核⼼代码讲解下⾯再来看下完整的代码import requestsfrom bs4 import BeautifulSoupimport timeimport osdef fire(): page = 0 for i in range(0, 450, 30): print("开始爬取第 %s 页" % page) url = '/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) res = (url).text data = get_poster_url(res) download_picture(data) page += 1 (1)def get_poster_url(res): content = BeautifulSoup(res, "") data = _all('div', attrs={'class': 'cover'}) picture_list = [] for d in data: plist = ('img')['src'] picture_(plist) return picture_listdef download_picture(pic_l): if not (r'picture'): (r'picture') for i in pic_l: pic = (i) p_name = ('/')[7] with open('picture' + p_name, 'wb') as f: (t)if __name__ == '__main__': fire()fire 函数这是⼀个主执⾏函数,使⽤ range 函数来处理分页。range 函数可以快速的创建整数列表,在 for 循环时及其好⽤。函数中的0代表从0开始计数,450代表⼀直迭代到450,不包含450,30代表步长,即每次递增的数字间隔。range(0, 450, 30),依次会输出:0,30,60,90 …format 函数,是⼀种字符串格式化⽅式(1) 即为暂停1秒钟get_poster_url 函数这个就是解析 HTML 的函数,使⽤的是 BeautifulSoup通过 find_all ⽅法查找所有 class 为 “cover” 的 div 元素,返回的是⼀个列表使⽤ for 循环,循环上⼀步拿到的列表,取出 src 的内容,append 到列表中append 是列表的⼀个⽅法,可以在列表后⾯追加元素download_picture 函数简易图⽚下载器⾸先判断当前⽬录下是否存在 picture ⽂件夹,os 库是⾮常常⽤⽤来操作系统相关的命令库, 就是创建⽂件夹split ⽤于切割字符串,取出⾓标为7的元素,作为存储图⽚的名称with ⽅法⽤来快速打开⽂件,打开的进程可以⾃⾏关闭⽂件句柄,⽽不再需要⼿动执⾏ () 关闭⽂件总结本节讲解了爬⾍的基本流程以及需要⽤到的 Python 库和⽅法,并通过⼀个实际的例⼦完成了从分析⽹页,到数据存储的全过程。其实爬⾍,⽆外乎模拟请求,解析数据,保存数据。当然有的时候,⽹站还会设置各种反爬机制,⽐如 cookie 校验,请求频度检查,⾮浏览器访问限制,JS 混淆等等,这个时候就需要⽤到反反爬技术了,⽐如抓取 cookie 放到 headers 中,使⽤代理 IP 访问,使⽤ Selenium 模拟浏览器等待⽅式。在这⾥还是要推荐下我⾃⼰建的Python学习群:721195303,群⾥都是学Python的,如果你想学或者正在学习Python ,欢迎你加⼊,⼤家都是软件开发党,不定期分享⼲货(只有Python软件开发相关的),包括我⾃⼰整理的⼀份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的⼩伙伴加⼊!

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687981834a63435.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信