【Python随笔】一天搞定,爬虫爬取w3schools的sql语句案例集
在很久以前的Easy Python系列中,介绍了通过爬虫手段爬取豆瓣电影信息的一种技术套路。今天故技重施,为了迎合先前做SQL语句分析的需要,决定爬取w3schools网站上面所有SQL案例,用作测试用例。
本文就来详细讲述,爬取w3schools网站的实现方式,以及里面需要注意的一些点。代码统一放在这里。
首先需要定位包含SQL语句的页面和元素。在w3schools网站当中,侧边栏部分(id='leftmenuinnerinner'
)列举了所有页面的链接,通过网页的<a target='_top>
标签就能筛选到,通过href
属性的指向就能够知道对应网页的URL。之后,对于每个网页里的SQL语句,所有语句都封装在class=w3-code notranslate sqlHigh
样式的标签当中。因此,我们只需要拿到所有网页,遍历打开所有页面,再把所有SQL标签里的语句文本抽出来,处理一下就可以了。
通过request的GET方式,能够直接获取到URL对应的网页内容,再用BeautifulSoup解析,就能够拿到HTML树,然后就可以按照这些条件来寻找对应元素以及里面的内容了。
比如,获取所有网页的代码如下:
def _get_all_pages() -> List[Tuple[str, str]]:# get root pagepage_url = ROOT_URLprint('get all pages from %s' % page_url)resp = requests.get(page_url, headers=_headers())soup = BeautifulSoup(resp.text, 'html.parser')# find leftmenuinnerinnerleft_menu = soup.find(id='leftmenuinnerinner')# find all pages at <a target="_top">links = left_menu.find_all(name='a', target='_top')pages = []for link in links:pages.append((link.text, link['href']))print('all pages are: %s' % json.dumps(pages, indent=2, ensure_ascii=False))print('overall %d pages!' % len(pages))return pages
爬取一个网页的SQL案例集的逻辑如下:
def _crawl_sqls(name, page, referer_page=''):sql_set = set()url = _page_url(page)print('[%s] crawling page url %s...' % (name, url))resp = requests.get(url, headers=_headers(referer_page=referer_page))soup = BeautifulSoup(resp.text, 'html.parser')# get all examples in class="w3-code notranslate sqlHigh"sql_blocks = soup.find_all(class_='w3-code notranslate sqlHigh')print('[%s] overall %d sql blocks' % (name, len(sql_blocks)))for sql_block in sql_blocks:# some children blocks may not contain space, which leads to# extracting non-separated SQLs like -> SELECT * FROM CustomersLIMIT 3;# so we should use get_text API# instead of using sql_block.text straightlysql_text_no_endl = sql_block.get_text(' ', strip=True).replace('\n', ' ').strip()sql_text = re.sub(r'\s+', ' ', sql_text_no_endl)if not sql_text.endswith(';'): # add semicolonsql_text = sql_text + ';'if sql_text not in sql_set:print('[%s] crawled new sql -> %s' % (name, sql_text))sql_set.add(sql_text)else:print('[%s] detected duplicated sql -> %s' % (name, sql_text))sqls = list(sql_set)print('[%s] crawl finished! added %d sqls!' % (name, len(sqls)))return sqls
这两块代码就基本上形成了爬虫的主逻辑,但是仅有这些还是远远不够的。很多网站为了反爬虫,会有一些限流操作,比如在w3schools每秒爬一个网页的话,爬到中间会request不到网页的内容,这就有可能触发限流机制了。面对这种场景,有几个方法可以规避:
- 时间间隔:调整长一点,比如10s一次
- User-Agent:随机设置为不同浏览器的UA,使得限流认为是不同的访问
- Referer:设置为网站主站,表示是从主站访问过来当前网页的
- 自动存储进度:每爬一个网站就把当前进度存下来,这样失败了下一次爬,就可以不需要从一开始爬起
如果还有更高级点,可以用代理服务器来爬,这样也能规避限流机制。通过以上的方式,就能把w3schools上面几百条SQL都给爬取到了。一天搞定,EZPZ!
【Python随笔】一天搞定,爬虫爬取w3schools的sql语句案例集相关推荐
- 使用scrapy爬虫,爬取17k小说网的案例-方法一
无意间看到17小说网里面有一些小说小故事,于是决定用爬虫爬取下来自己看着玩,下图这个页面就是要爬取的来源. a 这个页面一共有125个标题,每个标题里面对应一个内容,如下图所示 下面直接看最核心spi ...
- python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面
点击蓝字"python教程"关注我们哟! 我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识 ...
- python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面!
我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识一下:爬取豆瓣读书页面,Python用16行代码就搞定了! p ...
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...
- Python爬虫爬取肯德基餐厅信息案例实现(含源码及详细解释)
1. 需求: 爬取肯德基某一地区的餐厅数量以及其具体信息 (以下代码我仅仅展示出餐厅的店名信息,并将其用列表方式保存在.txt文件中) 2.学习python爬虫的好课推荐: b站上的路飞学城IT,提醒 ...
- python手机壁纸超清_python爬虫 爬取超清壁纸代码实例
简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...
- 使用scrapy爬虫,爬取17k小说网的案例-方法二
楼主准备爬取此页面的小说,此页面一共有125章 我们点击进去第一章和第一百二十五章发现了一个规律 我们看到此链接的 http://www.17k.com/chapter/271047/6336386 ...
- python b站日排行榜_python3爬虫-爬取B站排行榜信息
importrequests, re, time, os category_dic={"all": "全站榜","origin": &quo ...
- python制作爬虫爬取京东商品评论教程
python制作爬虫爬取京东商品评论教程 作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计 ...
最新文章
- .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
- linux热插拔原理,.NET Core 的热插拔机制的深入探索
- 当CDN遇上对象存储:完美!
- 韩顺平 servlet 笔记 第5讲
- 【Python】pandas 重复数据处理大全(附代码)
- Excel 批量处理行高(图文教程) - Excel篇
- WordPress主题modown6.2+erphpdown11.7
- python类和对象的定义_python类与对象基本语法
- Activemq 使用ssl说明
- 苹果开发者被盯上了!Xcode又双叒叕被攻击了
- 科研论文研读工具及英文论文写作
- svn和git有什么区别
- 计算机pe启动蓝屏怎么办,电脑使用PE系统蓝屏如何修复
- 【已解决】 “discovered_interpreter_python“: “/usr/bin/python“
- 记一次idea 打包时出现的错误 Discovered module-info.class. Shading will break its strong encapsulation.
- dingo php,Laravel Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Log4j2跨线程打印traceId
- 老杨说运维 | 证券行业运维数字化和智能化转型实践探索
- 20190227最近比较纠结的问题vue的video中视频的播放和nginx-rtmp的推流以及什么时候推流的分析
- 深入解析著名的阿里云Log4j 漏洞
热门文章
- 【观察】甲骨文:筑牢金融专有云坚实底座,重塑外资金融企业竞争力
- mybatis:Error parsing SQL Mapper Configuration
- PRML学习总结(8)——Graphical Models
- 蛇年最后一篇以及新春之礼:高效开发视频讲座下载
- 专注95后 “友加”打造最受年轻人喜爱的交友社区
- 利用JS代码判断火绒安全是否在用户本地运行
- Multi-Channel PCe QDMARDMA Subsystem
- javaweb JAVA JSP电影院在线订票系统JSP电影购票系统 JSP电影售票 JSP电影票预订系统支持在线选座jsp电影票预订系统
- linux进程管理基本概念
- 中国住宅单相燃气智能电表行业市场供需与战略研究报告