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
协议, 一般我们一定要设置为False
CONCURRENT_REQUESTS = 32
最大并发量, 默认为16
DOWNLOAD_DELAY = 0.5
下载延迟时间: 访问相邻页面的间隔时间, 降低数据抓取的频率COOKIES_ENABLED = False | True
Cookie
默认是禁用的, 取消注释则 启用Cookie
, 即:True
和False
都是启用Cookie
DEFAULT_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
版权声明:本文为博主原创文章,原创不易,请尊重原创转载请附上博文链接!