在很久以前的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语句案例集相关推荐

  1. 使用scrapy爬虫,爬取17k小说网的案例-方法一

    无意间看到17小说网里面有一些小说小故事,于是决定用爬虫爬取下来自己看着玩,下图这个页面就是要爬取的来源. a 这个页面一共有125个标题,每个标题里面对应一个内容,如下图所示 下面直接看最核心spi ...

  2. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面

    点击蓝字"python教程"关注我们哟! 我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识 ...

  3. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面!

    我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识一下:爬取豆瓣读书页面,Python用16行代码就搞定了! p ...

  4. 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等

    本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...

  5. Python爬虫爬取肯德基餐厅信息案例实现(含源码及详细解释)

    1. 需求: 爬取肯德基某一地区的餐厅数量以及其具体信息 (以下代码我仅仅展示出餐厅的店名信息,并将其用列表方式保存在.txt文件中) 2.学习python爬虫的好课推荐: b站上的路飞学城IT,提醒 ...

  6. python手机壁纸超清_python爬虫 爬取超清壁纸代码实例

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...

  7. 使用scrapy爬虫,爬取17k小说网的案例-方法二

    楼主准备爬取此页面的小说,此页面一共有125章 我们点击进去第一章和第一百二十五章发现了一个规律 我们看到此链接的  http://www.17k.com/chapter/271047/6336386 ...

  8. python b站日排行榜_python3爬虫-爬取B站排行榜信息

    importrequests, re, time, os category_dic={"all": "全站榜","origin": &quo ...

  9. python制作爬虫爬取京东商品评论教程

    python制作爬虫爬取京东商品评论教程 作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计 ...

最新文章

  1. .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
  2. linux热插拔原理,.NET Core 的热插拔机制的深入探索
  3. 当CDN遇上对象存储:完美!
  4. 韩顺平 servlet 笔记 第5讲
  5. 【Python】pandas 重复数据处理大全(附代码)
  6. Excel 批量处理行高(图文教程) - Excel篇
  7. WordPress主题modown6.2+erphpdown11.7
  8. python类和对象的定义_python类与对象基本语法
  9. Activemq 使用ssl说明
  10. 苹果开发者被盯上了!Xcode又双叒叕被攻击了
  11. 科研论文研读工具及英文论文写作
  12. svn和git有什么区别
  13. 计算机pe启动蓝屏怎么办,电脑使用PE系统蓝屏如何修复
  14. 【已解决】 “discovered_interpreter_python“: “/usr/bin/python“
  15. 记一次idea 打包时出现的错误 Discovered module-info.class. Shading will break its strong encapsulation.
  16. dingo php,Laravel Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
  17. Log4j2跨线程打印traceId
  18. 老杨说运维 | 证券行业运维数字化和智能化转型实践探索
  19. 20190227最近比较纠结的问题vue的video中视频的播放和nginx-rtmp的推流以及什么时候推流的分析
  20. 深入解析著名的阿里云Log4j 漏洞

热门文章

  1. 【观察】甲骨文:筑牢金融专有云坚实底座,重塑外资金融企业竞争力
  2. mybatis:Error parsing SQL Mapper Configuration
  3. PRML学习总结(8)——Graphical Models
  4. 蛇年最后一篇以及新春之礼:高效开发视频讲座下载
  5. 专注95后 “友加”打造最受年轻人喜爱的交友社区
  6. 利用JS代码判断火绒安全是否在用户本地运行
  7. Multi-Channel PCe QDMARDMA Subsystem
  8. javaweb JAVA JSP电影院在线订票系统JSP电影购票系统 JSP电影售票 JSP电影票预订系统支持在线选座jsp电影票预订系统
  9. linux进程管理基本概念
  10. 中国住宅单相燃气智能电表行业市场供需与战略研究报告