1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜

python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜

时间:2023-06-01 20:30:14

相关推荐

python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜

Scrapy+Selenium切换iframe抓取网易云音乐排行榜

iframe标签Selenium (WEB自动化工具)Scrapy 框架

iframe标签

了解一下iframe

百度百科介绍的iframe网易云音乐的iframe标签如图所示:

Selenium (WEB自动化工具)

selenium爬虫

百度百科介绍的selenium

selenium官网有疑惑的同学可以了解一下博主的这篇文章

python3+selenium爬取京东笔记本电脑详情信息

Scrapy 框架

ScrapyScrapy 2.3.0 文档Scrapy概述

异步处理框架,可配置和可扩展程度非常高,Python中使用最广泛的爬虫框架

Scrapy的安装linux安装

sudo pip3 install Scrapy

Windows安装

python - m pip install Scrapy

Scrapy组件及流程

引擎(Engine)----------整个框架核心爬虫程序(Spider)------数据解析提取调度器(Scheduler)-----维护请求队列下载器(Downloader)----获取响应对象管道文件(Pipeline)-----数据入库处理【两个中间件】下载器中间件(Downloader Middlewares)引擎->下载器,包装请求(随机代理等)蜘蛛中间件(Spider Middlewares)引擎->爬虫文件,可修改响应对象属性

图解:

Scrapy爬虫工作流程 爬虫项目启动,由引擎向爬虫程序索要第一批要爬取的URL,交给调度器去入队列调度器处理请求后出队列,通过下载器中间件交给下载器去下载下载器得到响应对象后,通过蜘蛛中间件交给爬虫程序爬虫程序进行数据提取:

4.1) 数据交给管道文件去入库处理

4.2) 对于需要继续跟进的URL,再次交给调度器入队列,依次循环Scrapy命令

创建爬虫项目 :scrapy startproject 项目名

创建爬虫文件

2.1)cd 项目文件夹

2.2)scrapy genspider 爬虫名 域名

运行爬虫

方法一: 终端运行

scrapy crawl 爬虫名

方法二:PyCharm运行

创建run.py(和scrapy.cfg文件同目录创建)

from scrapy import cmdlinecmdline.execute('scrapy crawl wangyi'.split())

直接运行run.py即可

Scrapy目录结构

Wangyi # 项目文件夹├── WangYi# 项目目录│ ├── items.py # 定义数据结构│ ├── middlewares.py # 中间件│ ├── pipelines.py # 数据处理│ ├── settings.py# 全局配置│ └── spiders│ ├── wangyi.py # 爬虫文件└── scrapy.cfg# 项目基本配置文件

有关settings.py的常用变量USER_AGENT = 'Mozilla/5.0'ROBOTSTXT_OBEY = False

是否遵循robots协议, 一般我们一定要设置为FalseCONCURRENT_REQUESTS = 32

最大并发量, 默认为16DOWNLOAD_DELAY = 0.5

下载延迟时间: 访问相邻页面的间隔时间, 降低数据抓取的频率COOKIES_ENABLED = False | True

Cookie默认是禁用的, 取消注释则 启用Cookie, 即:TrueFalse都是启用CookieDEFAULT_REQUEST_HEADERS = {}

请求头, 相当于requests.get(headers=headers)分析本次需求

抓取网易云音乐数据(排行榜)

URL地址:/#/discover/toplist

图例:

所抓数据

排名 -->ranking

歌名 -->title

时长 -->time

歌手 -->singer

分析完毕~ ~ ~正篇来了!

创建项目和爬虫文件

scrapy startproject Wangyi

cd Wangyi

scrapy genspider wangyi www.

定义要爬取的数据结构items.py

""" items.py """import scrapyclass WangyiItem(scrapy.Item):# 歌名title = scrapy.Field()# 排名ranking = scrapy.Field()# 时长time= scrapy.Field()# 歌手singer= scrapy.Field()

编写爬虫文件wangyi.py

""" wangyi.py """# -*- coding: utf-8 -*-import scrapyfrom selenium import webdriverfrom ..items import WangyiItemfrom scrapy.linkextractors import LinkExtractor # 链接提取器options = webdriver.FirefoxOptions()options.add_argument('--headless') #无界面模式class WangyiSpider(scrapy.Spider):name = 'wangyi'allowed_domains = ['www.']start_urls = ['/#/discover/toplist']def __init__(self):super().__init__()self.driver = webdriver.Firefox(options=options)def parse(self, response):# 响应内容# print(response.text)le = LinkExtractor()links = le.extract_links(response)for link in links:yield {'file_urls': [link.url]}# 获取内容tr_list = response.xpath('//table/tbody/tr')item = WangyiItem()for tr in tr_list:number = tr.xpath('./td[1]/div/span/text()')name = tr.xpath('./td[2]/div/div/div/span/a/b/@title')time = tr.xpath('./td[3]/span/text()')lable = tr.xpath('./td[4]/div/span/@title')# 结果: 列表,元素为选择器对象# .extract_first()# .get()# 获取单个item['ranking'] = number.get()item['title'] = name.get()item['time'] = time.get()item['singer'] = lable.get()# print(item)yield itemdef close(spider, reason):spider.driver.quit()# 关闭浏览器

中间件middlewares.py

""" middlewares.py """from scrapy import signalsfrom scrapy.http import HtmlResponse# 在 爬虫名DownloaderMiddleware 添加class WangyiDownloaderMiddleware:def process_request(self, request, spider):if spider.name == 'wangyi':spider.driver.get(request.url) #使用浏览器访问爬取网址iframe = spider.driver.find_element_by_xpath('//*[@id="g_iframe"]') #定位到iframespider.driver.switch_to.frame(iframe) #最重要的,切换到iframe的html中body = spider.driver.page_source #获取iframe中的html内容#重新将html的xml封装为response对象传给spiderreturn HtmlResponse(url=spider.driver.current_url, body=body, encoding='utf-8', request=request)else:return None

全局配置文件settings.py注意:配置需谨慎

""" settings.py """# robots协议ROBOTSTXT_OBEY = False# 下载延迟时间DOWNLOAD_DELAY = 1from fake_useragent import UserAgent# 请求头DEFAULT_REQUEST_HEADERS = {# ....'User-Agent': UserAgent().random}# 中间件DOWNLOADER_MIDDLEWARES = {'WangYi.middlewares.WangyiDownloaderMiddleware': 543,}# 管道 处理数据ITEM_PIPELINES = {'WangYi.pipelines.WangyiPipeline': 300,}

管道文件处理数据pipelines.py

""" pipelines.py """import csv # 存储csv 文件class WangyiPipeline(object):def process_item(self, item, spider):try:# 打开csv文件with open('music.csv', 'a+') as file:# 初始化写入对象write = csv.writer(file)# 写入数据(参数为列表)write.writerow([item['number'], item['name'], item['time'], item['label']])except Exception as error:passreturn item

运行爬虫run.py

""" run.py """from scrapy import cmdlinecmdline.execute('scrapy crawl wangyi'.split())

数据存储文件方式一:

scrapy crawl wangyi -o 指定文件类型存入csv文件

from scrapy import cmdlinecmdline.execute('scrapy crawl wangyi -o music.csv'.split())

存入json文件

from scrapy import cmdlinecmdline.execute('scrapy crawl wangyi -o music.json'.split())

注意:settings.py中设置导出编码 - 主要针对json文件

FEED_EXPORT_ENCODING = 'utf-8'

文件类型'json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle'方式二:

pipelines.py存储

这里管道文件存储(pipelines.py)存入csv文件为例

获取数据如下:(只展示部分数据)

作者:淮南子.

来源:CSDN

版权声明:本文为博主原创文章,原创不易,请尊重原创转载请附上博文链接!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。