爬虫入门到放弃系列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 requests
from 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].string
category = soup.select("span.type")[0].string
alias = soup.select("span.type_txt")[0].string
area = soup.select("span.type_txt")[1].string
parts =soup.select("span.type_txt")[2].string
date = soup.select("span.type_txt")[3].string
update = soup.select("span.type_txt")[4].string
tag = soup.select("a.tag")[0].string
describe = soup.select("span._desc_txt_lineHight")[0].string
print(name, category, alias, parts, date, update, tag, describe, sep='\n')

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


输出结果

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

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

请求响应内容

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

结语

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

</br>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容