【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)
本篇文章涉及到数据解析方面的知识(聚焦爬虫)
在看这篇文章之前,建议读者有一定的爬虫相关的基础知识,零基础的同学请移步
- 半小时学会python爬虫
以下是本篇文章正文内容,建议使用PyCharm等工具进行实践
文章目录
- 1 引入
- 2 正则表达式解析
- 2.1 实战:糗事百科图片数据爬取
- 爬一张图片试一试
- 爬取第一页所有的图片
- 爬取所有页数的图片
- 3 bs4解析
- 3.1 环境安装
- 3.2 bs4的数据解析原理
- 3.3 BeatuifulSoup对象的实例化
- 3.4 BeautifulSoup对象的属性和方法
- 3.5 实战:爬取小说所有的章节的内容
- 4 xpath解析
- 4.1 原理
- 4.2 环境安装
- 4.3 实例化对象
- 4.4 调用xpath方法捕获数据
- 4.5 实战:爬取58二手房的房源信息
- 4.6 实战:解析下载图片数据
- 4.7 实战:爬取全国城市名称
1 引入
1、聚焦爬虫
大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。
2、数据解析的分类:
- 正则表达式
- bs4解析
- xpath解析(重点)
3、数据爬取的流程可以修改为:
- 指定url
- 发起请求
- 获取响应数据
- 数据解析
- 持久化存储
4、数据解析原理
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
因此,数据解析的步骤如下:
- 进行指定标签的定位
- 标签或标签对应的属性中存储的数据值进行提取(解析)
2 正则表达式解析
正则表达式的相关内容可以自行学习一下,不用背,会查就行
下面直接开始实战
2.1 实战:糗事百科图片数据爬取
1、需求
爬取糗事百科中热图模块下的所有图片
地址:https://www.qiushibaike.com/imgrank/
2、分析
所有的图片都是有图片地址的
使用content可以存储二进制文件(图片,见下编码1)
进行通用爬虫,可以发现src在元素img中
进行聚焦爬虫,获取src路径,正则表达式如下:
ex='<div class="thumb">.*?<img src="(.*?)"alt.*?</div>'
3、编码
爬一张图片试一试
首先,可以先试一试爬一张图片,代码如下:
import requests
if __name__ == "__main__" :# UA伪装headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 指定图片的URLurl = 'https://pic.qiushibaike.com/system/pictures/12383/123839033/medium/U1LTJQIQJDP8TCKP.jpg'# 发起请求,携带参数requests.get(url=url,headers=headers)# 获取响应对象response = requests.get(url=url,headers=headers)# 获取响应数据,content返回二进制形式的图片jpg = response.contentwith open('./a.jpg','wb')as fp:fp.write(jpg)
爬取第一页所有的图片
代码如下:
注意看注释
import requests
import re
import osif __name__ == "__main__" :# 创建一个文件夹,保存图片if not os.path.exists('./图片'):os.mkdir('./图片')# UA伪装headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 指定URLurl = 'https://www.qiushibaike.com/imgrank/'# 通用爬虫对整张页面进行爬取# 发起请求,携带参数requests.get(url=url,headers=headers)# 获取响应对象response = requests.get(url=url,headers=headers)# 获取响应数据page_text = response.text# 使用聚焦爬虫,取出所有的图片ex='<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'img_src_list = re.findall(ex,page_text,re.S)for src in img_src_list:# 拼接出一个完整的图片地址src = 'https:'+src# 请求到图片的二进制数据img_data = requests.get(url = src,headers=headers).content# 生成图片名称,从原始的地址中切分出来img_name = src.split('/')[-1]# 图片存储的路径img_path = './图片/'+img_name# 持久化存储with open(img_path,'wb')as fp:fp.write(img_data)
爬取所有页数的图片
代码如下,与上一段代码进行对比:
import requests
import re
import osif __name__ == "__main__" :# 创建一个文件夹,保存图片if not os.path.exists('./所有图片'):os.mkdir('./所有图片')# UA伪装headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 指定URL模版url = 'https://www.qiushibaike.com/imgrank/page/%d/'for pageNum in range(1,14):# 对应页面的urlnew_url = format(url%pageNum)# 通用爬虫对整张页面进行爬取# 发起请求,携带参数requests.get(url=url,headers=headers)# 获取响应对象response = requests.get(url=new_url,headers=headers)# 获取响应数据page_text = response.text# 使用聚焦爬虫,取出所有的图片ex='<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'img_src_list = re.findall(ex,page_text,re.S)for src in img_src_list:# 拼接出一个完整的图片地址src = 'https:'+src# 请求到图片的二进制数据img_data = requests.get(url = src,headers=headers).content# 生成图片名称,从原始的地址中切分出来img_name = src.split('/')[-1]# 图片存储的路径img_path = './所有图片/'+img_name# 持久化存储with open(img_path,'wb')as fp:fp.write(img_data)
3 bs4解析
3.1 环境安装
1. 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等2. windows(1)打开文件资源管理器(文件夹地址栏中)(2)地址栏上面输入 %appdata%(3)在这里面新建一个文件夹 pip(4)在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可[global]timeout = 6000index-url = https://mirrors.aliyun.com/pypi/simple/trusted-host = mirrors.aliyun.com3. linux(1)cd ~(2)mkdir ~/.pip(3)vi ~/.pip/pip.conf(4)编辑内容,和windows一模一样4. 需要安装:pip install bs4bs4在使用时候需要一个第三方库,把这个库也安装一下pip install lxml
3.2 bs4的数据解析原理
- 实例化一个BeatuifulSoup对象,并且将页面源码数据加载到该对象中
- 通过调用对象的相关属性或者方法解析标签定位和数据提取
3.3 BeatuifulSoup对象的实例化
from bs4 import BeautifulSoup# 1、将本地的html文档中的数据加载到该对象中
fp = open('./test.html',encoding=utf-8)
soup = Beautiful(fp,'lxml')# 2、将互联网上的html文档中的数据加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text,'lxml')
3.4 BeautifulSoup对象的属性和方法
1、soup.tagName
# 返回html中第一次出现的tagname标签
soup.a
soup.div
2、soup.find()
# soup.find('tagname'),返回的和soup.tagname一样
soup.find('div')# soup.find('tagname',class_/id/attr='')
soup.find('div',class_'song')
3、soup.find_all()
# soup.find_all('tagname'),返回所有符合要求的标签(列表)
soup.find_all('a')
4、soup.select()
# 返回一个列表,选择器包括id选择器,类选择器、标签选择器
soup.select('.classname')# 层级选择器,> 表示一个层级
soup.select('.classname > ul > li > a')# 层级选择器,空格表示多个层级
soup.select('.classname > ul a')
5、获取标签之间的文本数据
# 获取a标签的文本数据,text、string、get_text()# text和get_text()可以获取标签下的所有的文本内容,即使不属于直系内容
soup.a.text
soup.a.get_text()# string只可以获取该标签下直系的文本内容
soup.a.string
6、获取标签中的属性值
soup.a['属性名称']
3.5 实战:爬取小说所有的章节的内容
1、需求
爬取三国演义小说所有的章节标题和内容
http://www.shicimingju.com/book/sanguoyanyi.html
2、分析
先使用通用爬虫,可以看到a标签的href对应的是链接,内容为章节的标题
使用聚焦爬虫获取标题所对应的内容
3、编码
import requests
import re
import os
from bs4 import BeautifulSoupif __name__ == "__main__":# UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 对首页数据进行爬取url = 'https://www.shicimingju.com/book/sanguoyanyi.html'# 获取数据page_text = requests.get(url=url, headers=headers).text# 在首页中解析出章节的标题和详情页的url# 1、实例化soup = BeautifulSoup(page_text, 'lxml')# 2、解析标题和urlli_list = soup.select('.book-mulu > ul > li')# 打开文件fp = open('./sanguo.txt', 'w', encoding='utf-8')for li in li_list:# 获取a标签的标题和hreftitle = li.a.stringdetail_url = 'https://www.shicimingju.com' + li.a['href']# 对详情页发起请求detail_page_text = requests.get(url=detail_url, headers=headers).text# 解析章节的内容detail_soup = BeautifulSoup(detail_page_text, 'lxml')dic_tag = detail_soup.find('div', class_='chapter_content')# 获取到了内容content = dic_tag.text# 持久化存储fp.write(title + ':' + content + '\n')
4 xpath解析
4.1 原理
XPath具有十分强大的选择功能,有一百多种内置函数,几乎可以对我们所有需要选择的节点的内容匹配和节点处理提供支持。
是最通用的数据解析方式
原理:
- 实例化etree对象,且需要将被解析的页面源码数据加载到该对象中
- 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
4.2 环境安装
pip install lxml
4.3 实例化对象
from lxml import etree
- 将本地的html文档中的源码数据加载到etree对象中
etree.parse(filepath)
- 将从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')
4.4 调用xpath方法捕获数据
xpath('xpath表达式')
常用xpath表达式:
# 实例化一个etree对象
tree = etree.parse('./a.html')# 定位标签 返回列表,存储了element类型对象(一个或多个)
r = tree.xpath('/html/head/title') # ‘/’表示从根节点开始定位,一个层级
r = tree.xpath('/html//title') # '//'表示多个层级
r = tree.xpath('//title') # 表示从任意位置定位title标签# 定位属性 返回列表,写法:标签[@属性=“属性值”]
r = tree.xpath('//div[@class="a"]') # 定位到class为a的所有div# 索引定位 返回列表,索引从1开始
r = tree.xpath('//div[@class="a"]/p[3]')#定位到class为a的div下的第三个p标签 # 取文本1 返回列表,写法:标签/text()获取直系文本内容
r = tree.xpath('//div[@class="a"]//li[1]/a/text()')# 取文本2 返回列表,写法:标签//text() 获取所有的文本内容
r = tree.xpath('//div[@class="a"]//li[1]//text')# 取属性 返回列表,写法:标签/@属性名称
r = tree.xpath('//div[@class="a"]/img/@src')
注意:/表示根标签,./表示当前标签
4.5 实战:爬取58二手房的房源信息
1、需求
爬取58二手房的房源信息
https://sy.58.com/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-000b-cda5-35a9-c4d948f85c33&ClickID=2
2、编码
import requests
import re
from lxml import etreeif __name__ == "__main__" :# UA伪装headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 指定urlurl = 'https://sy.58.com/ershoufang/'# 获取页面数据page_text = requests.get(url = url,headers=headers).text# 数据解析# 1、实例化tree = etree.HTML(page_text)# 2、调用xpath定位li标签li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')# 3、获取a标签fp = open('58.txt','w',encoding='utf-8')for li in li_list:title = li.xpath('./div[2]/h2/a/text()')[0]fp.write(title)
4.6 实战:解析下载图片数据
1、需求
解析下载图片数据
http://pic.netbian.com/4kqiche/
2、编码
注意:这个网站可能被爬了太多次,已经设置了防护措施,所以这里其实是爬不了的,大家看代码学习一下方法就好。
import requests
import re
import os
from lxml import etreeif __name__ == "__main__" :# 创建一个文件夹,保存图片if not os.path.exists('./所有图片'):os.mkdir('./所有图片') # UA伪装headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 指定urlurl = 'http://pic.netbian.com/4kqiche/'# 获取页面数据response = requests.get(url = url,headers=headers)
# response.encoding = 'utf-8'page_text = response.text# 数据解析# 1、实例化tree = etree.HTML(page_text)# 2、调用xpath定位li_list = tree.xpath('//ul[@class="clearfix"]/li')# 3、获取src属性值for li in li_list:src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]title = li.xpath('./a/img/@alt')[0]+'.jpg'title = title.encode('iso-8859-1').decode('gbk')# 持久化存储img_data = requests.get(url = src,headers=headers).contentimg_path = '所有图片/'+titlewith open (img_path,'wb')as fp:fp.write(img_data)
4.7 实战:爬取全国城市名称
1、需求
爬取全国城市的名称
https://www.aqistudy.cn/historydata/
2、编码
import requests
import re
import os
from lxml import etreeif __name__ == "__main__" :# UA伪装headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'}# 指定urlurl = 'https://www.aqistudy.cn/historydata/'# 获取页面数据response = requests.get(url = url,headers=headers)page_text = response.text# 数据解析# 1、实例化tree = etree.HTML(page_text)# 2、调用xpath定位li_list_h = tree.xpath('//div[@class="hot"]/div[2]/ul/li')li_list_c = tree.xpath('//div[@class="all"]/div[2]/ul')city = []# 3、获取for li in li_list_h:host_city_name = li.xpath('./a/text()')[0]city.append(host_city_name)for li in li_list_c:all_city_name_li = li.xpath('./div[2]/li')for lii in all_city_name_li:all_city_name = lii.xpath('./a/text()')[0]city.append(all_city_name)print(city)
结果:
【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)相关推荐
- python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)
原标题:零基础小白学习Python编程语言的正确姿势(纯干货) 敢问有哪种编程语言集简洁.优雅.简单.全能于一身?Python绝对算的上是一个.举个例子,比如完成同一个任务,C语言需要写1000行代码 ...
- Python 之 进阶 学习
学习 Python 之 进阶学习 一切皆对象 1. 变量和函数皆对象 2. 模块和类皆对象 3. 对象的基本操作 (1). 可以赋值给变量 (2). 可以添加到集合中 (3). 可以作为函数参数 (4 ...
- 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- 2021年超详细的-Android超神学习路线总结--纯干货分享(字节,阿里,腾讯大牛联合打造)
前言 2021年秋招没有找到满意工作的童鞋,考研结果不理想的童鞋,留学生回国的童鞋们,都开始准备2021年的春招了,如果想从事Android开发工作,可以参考本文. 本文整理了Android开发的学习 ...
- Python 爬虫进阶一之爬虫框架概述
综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化 Python 相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一 ...
- python爬虫设计模式_Python爬虫进阶一之爬虫框架概述
综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一些优 ...
- python爬虫:爬虫进阶之多线程爬虫
多线程爬虫 有些时候,比如下载图片,因为下载图片是一个耗时的操作.如果采用之前那种同步的方式下载.那效率肯会特别慢.这时候我们就可以考虑使用多线程的方式来下载图片. 多线程介绍: 多线程是为了同步完成 ...
- python爬虫进阶案例_Python爬虫进阶必备 | MD5 hash 案例解析讲解
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:努力在北京混出人样 ( 想要学习Python?Pyth ...
- 爬虫进阶学习之路---js逆向登录
js逆向: 1.凡科网(https://i.fkw.com) 通过登录页面练习 再练习的过程中发现 我在登录错误密码之后会出现滑块验证(瞬间感觉头大了 但是学习吗 硬着头皮上了)还是常规的操作 打开 ...
最新文章
- 插件制作教程 php,typecho插件编写教程(二):写一个新插件
- TCP/UDP编程中的问题汇总
- VC++ 鼠标非显示区域命中测试消息WM_NCHITTEST和相关编程问题学习1
- Redis之intset(整数集合)
- 《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.11 高速缓存的性能...
- R语言——导入Excel表格数据方法
- Yii CDBCriteria常用方法
- Tensorflow1.x 和 2.x如何读取ckpt中保存了那些参数
- 【转载】DataKeyNames,DataKeys 用法浅谈
- 引入Spring集成
- 12.Bridge-桥接模式
- 面向对象思想,简单实例
- ensp查看历史配置命令_华为eNSP配置基本命令
- ODAC for delphi 安装
- LabVIEW与西门子1200,1500系列Sanp7协议通讯案例+QMH标准框架编写,非常实用,长期测试通讯无误。
- Spring中init-method和destroy-method的四种方式
- 一文让你通俗理解奇异值分解
- 算法导论 3.2-1 关于单调递增函数的证明
- ssh三台主机互信实现免密登录
- 同一命名空间下,无法引用类时
热门文章
- java仿qq_java模仿实现QQ登录界面
- Android 实现息屏和唤醒
- linux版本及系统启动过程
- VUE 2.0 插件库
- Apache Dubbo已不再局限于Java语言
- 只能上QQ不能打开网页的几个原因及解决方法
- 失传的C结构体打包技艺
- Linux下采用ss5搭建sock5服务器使用proxychains进行sock5客户端代理
- 不反编译、无逆向基础也能轻松编写Android App Hook插件? Xposed的远房表弟,Hookworm来也!
- 关于Win10蓝屏终止代码:WHEA_UNCORRECTABLE_ERROR的解决方法