写点什么

爬虫入门到放弃 01:一句话概括什么是爬虫

发布于: 2021 年 07 月 07 日
爬虫入门到放弃01:一句话概括什么是爬虫

序章

18 年初,还在实习期的我因为工作需求开始接触 Java 爬虫,从一个网站爬取了 163W 条 poi 数据,这是我人生中写的第一个爬虫,也是唯一的一个 Java 爬虫。后来这些 poi 数据也成了我毕业设计中的一部分。后来开始学习 Python 爬虫以及爬虫框架 Scrapy,尤其是 Scrapy,前前后后研究了一个多月,并利用 Scrapy 构建了千万级数据的 ICA(互联网内容识别)资源库。


写爬虫系列的目的主要是想记录一下自己学习爬虫的经历,以及遇到的一些问题,也希望能够给爬虫初学者带来一些启示。之前给同事普及爬虫的时候,自己动手做了人生中的第一个 PPT,所以爬虫系列文章将围绕着这个 PPT 来开展。

系列结构


如图,将从四个方面来介绍爬虫。


  1. 爬虫入门:主要包括爬虫的基本概念、技术栈、爬虫程序的开发等。

  2. 反爬技术:主要是讲述常见的反爬虫技术以及应对方法。

  3. Scrapy 框架:目前最好的爬虫框架,也是本系列文章的重点内容。

  4. 风险规避:讲述如何编写规范的爬虫,如何避免数据风险。

前言

很多人包括我在内,刚开始听到爬虫的时候都会有一种朦朦胧胧、遥不可及的感觉。很多人觉得只有程序员才需要使用爬虫,其实并不是。至少,Python 处理文档和爬虫的能力是面向日常工作的。


举个栗子:有人需要每天从各个网站上粘贴成百上千条数据到 excel 中,如果使用爬虫,一个 requests、pandas 或 xlwt 就搞定了,几十行代码而已。日常上线需求需要根据模板来写三个文档进行上传,前前后后粘贴需要四五分钟,后来我为了偷懒用 Python 写了个程序打包成 exe,点击一下几秒就完成了。所以,Python 让日常工作工作更高效,值得更多的人学习。


本篇文章主要从第一章爬虫入门开始讲起。


爬虫概念


什么是爬虫?


这是当初我学习开发爬虫的时候,脑海里浮现的第一个问题。不论网上怎么介绍爬虫,是 spider、crawler 也好,是 robots 也罢。我的理解就是:模拟人的行为从网页上获取的数据的程序。更具象一些:在 Java 中爬虫是 Jsoup.jar,在 Python 中爬虫是 requests 模块,甚至 Shell 中的 curl 命令也可以看做是爬虫。


爬虫库可以分为两个部分。一是请求部分,主要负责请求数据,例如 Python 的 requests;二是解析部分,负责解析 html 获取数据,例如 Python 的 BS4。


爬虫做了什么工作?


模仿人的行为从网页获取数据。一个人,需要先打开浏览器、输入网址,从网站后台获取网页并加载到浏览器展示,最后才能获取数据。爬虫的请求部分,就相当于浏览器的角色,会根据你输入的 url 从网站后台获取 html,而解析部分就会根据预先设定的规则,从 html 中获取数据。


而开发者的工作,一是装饰请求部分,例如在请求头中添加 User-Agent、Cookie 等,让网站觉得是一个人通过浏览器来访问的,而不是一个程序。二是通过选择器来编写规则,从页面获取数据。


这是浏览器的请求头内容。


技术栈


做爬虫需要什么具备什么样的技术?是不是只有大佬才可以?其实并不是。这里主要分为两个层次要求。

基本要求

编程语言:只需要有 Java 或者 Python 基础即可,有基本的 Html 阅读能力以及 CSS 选择器、Xpath 选择器、正则表达式的使用能力。


数据存储:爬取的数据要只有存储下来才有意义。数据可以保存在文件或数据库中,这就要求开发者有文件读写或数据库操作的能力。对于数据库,掌握基本的表结构设计、增删改查的能力即可。


开发者工具:爬虫开发者使用最多的工具,各种浏览器按下 F12 都会弹出。通常用来拦截请求,定位元素,查看 JS 源文件。


进阶要求

在爬虫的开发中,会遇到各种各样的问题,就需要有独立思考和解决问题的能力。目前,很多网站都采用了异步加载数据或 JS 加密,所以需要具备 Ajax 和 JS 方面的知识。


网络知识。基本的状态码:20x 成功,30x 转发重定向,40x 请求不存在、50x 服务端问题。有时候还需要 TCP 的知识,例如 established、time_waited 等 TCP 连接状态代表着什么。

爬虫开发

基础概念我们已经讲完,怎么来开发个爬虫呢?举个栗子:



如图,是星斗苍凉、月色照亮的动漫斗罗大陆的播放页面。我们以此为例,开发爬虫来获取页面数据。

Java 爬虫

Java 爬虫的开发主要使用 Jsoup。


引入 Jsoup 依赖:


    <dependency>      <groupId>org.jsoup</groupId>      <artifactId>jsoup</artifactId>      <version>1.11.2</version>    </dependency>
复制代码


程序开发:


import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.IOException;
public class JavaCrawler { public static void main(String[] args) throws IOException { String url = "https://v.qq.com/detail/m/m441e3rjq9kwpsc.html"; // 发起请求,获取页面 Document document = Jsoup.connect(url).get(); // 解析html,获取数据 Element body = document.body(); Element common = body.getElementsByClass("video_title_cn").get(0); String name = common.getElementsByAttribute("_stat").text(); String category = common.getElementsByClass("type").text(); Elements type_txt = body.getElementsByClass("type_txt"); String alias = type_txt.get(0).text(); String area = type_txt.get(1).text(); String parts = type_txt.get(2).text(); String date = type_txt.get(3).text(); String update = type_txt.get(4).text(); String tag = body.getElementsByClass("tag").text(); String describe = body.getElementsByClass("_desc_txt_lineHight").text(); System.out.println(name + "\n" + category + "\n" + alias + "\n" + area + "\n" + parts + "\n" + date + "\n" + update + "\n" + tag + "\n" + describe);
}}
复制代码

Python 爬虫

对于 Python 爬虫的开发,使用的是 requests 和 bs4。


安装模块:


pip install requests bs4
复制代码


程序开发:


import requestsfrom bs4 import BeautifulSoup
url = 'https://v.qq.com/detail/m/m441e3rjq9kwpsc.html'# 发起请求,获取页面response = requests.get(url)# 解析html,获取数据soup = BeautifulSoup(response.text, 'html.parser')name = soup.select(".video_title_cn a")[0].stringcategory = soup.select("span.type")[0].stringalias = soup.select("span.type_txt")[0].stringarea = soup.select("span.type_txt")[1].stringparts =soup.select("span.type_txt")[2].stringdate = soup.select("span.type_txt")[3].stringupdate = soup.select("span.type_txt")[4].stringtag = soup.select("a.tag")[0].stringdescribe = soup.select("span._desc_txt_lineHight")[0].stringprint(name, category, alias, parts, date, update, tag, describe, sep='\n')
复制代码


上面两个程序输出相同的结果:



至此,斗罗大陆的爬虫开发工作就完成了。从代码也能看出来,请求部分也就一行,大部分都是解析部分的,这里使用 css 选择器来完成数据的解析。


我们再来看看请求部分获取的网页内容:



当然,一个完整的爬虫程序除了以上模块,还需要有存储模块,必要的时候还需要代理池模块。其次,对于整个大型网站数据的爬取还需要对网站进行深度/广度遍历来完成,还需要考虑到如果爬虫中断,如何从断点开始继续爬取等方面的设计。这一部分的内容后面会写。


对于 Jsoup 资料、requests、scrapy 视频教程,公众号后台回复 爬虫资料 即可获取。

结语

这一篇文章不对程序的开发做过多的深入探讨,只讲述爬虫的概念以及程序演示。而下一篇文章会根据上面的程序,着重对 Jsoup 和 requests、bs4 模块以及 css 选择器的使用深入探究。期待下一次相遇。



95 后小程序员,写的都是日常工作中的亲身实践,置身于初学者的角度从 0 写到 1,详细且认真。


文章会在公众号 [入门到放弃之路] 首发,期待你的关注。



发布于: 2021 年 07 月 07 日阅读数: 9
用户头像

公众号:入门到放弃之路 2021.05.23 加入

公众号:入门到放弃之路。自学Java、python、大数据。

评论

发布
暂无评论
爬虫入门到放弃01:一句话概括什么是爬虫