python项目实战之网络爬虫详解(代码片段)

愛彈吉他的小盆友 愛彈吉他的小盆友     2023-01-04     327

关键词:



一、概述

网络爬虫(Web crawler),又称为网络蜘蛛(Web spider)或网络机器人(Web robot),主要用来爬取目标网站内容的程序或脚本。

从功能上来区分网络爬虫:

  • 数据采集
  • 数据处理
  • 数据储存

以上三个部分,基本工作框架流程如下图:


二、原理

  • 功能:下载网页数据,为搜索引擎系统提供数据来源。
  • 组件:控制器、解析器、资源库。

Web网络爬虫系统首先将种子URL放入下载队列,然后简单地从队首中取出一个URL下载其对应的网页。得到网页的内容将其储存后,再经过解析网页中的链接信息可以得到一些新的URL,将这些URL加入下载队列。然后取出一个URL,对其对应的网页进行下载,再解析,如此反复进行,直到遍历了整个网络或满足某种条件后才会停止下来。

三、爬虫分类

1、传统爬虫

传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

2、聚焦爬虫

聚焦爬虫工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用链接并将其放入等待抓取URL队列。然后它将根据一定搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统某一条件时停止。另外所有被爬虫抓取的网页将会被系统存储,进行一定的分析、过滤,并建立索引,以便之后的查询和检索。对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。

3、通用网络爬虫(全网爬虫)

通用网络爬虫又称全网爬虫, 爬行对象从一些种子URL扩充到整个Web,主要为门户站点搜索引擎和大型Web服务提供商采集数据。这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面顺序要求相对较低,同时由于待刷新页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。虽然存在一定缺陷, 但通用网络爬虫适用于为搜索引擎搜索广泛的主题,有较强应用价值。

实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

四、网页抓取策略

在爬虫系统中,待抓取URL队列是很重要的一部分。队列中URL以什么样顺序排列也是一个很重要的问题,因为这涉及先抓取哪个页面,后抓取哪个页面。

而决定这些URL排列顺序的方法,称之为抓取策略。

1、宽度优先搜索:

在抓取过程中,在完成当前层次搜索后,才进行下一层次搜索。

  • 优点:算法设计和实现相对简单。
  • 缺点:随着抓取网页增多,大量无关网页将被下载并过滤,算法效率将变低。

2、深度优先搜索:

从起始网页开始,选择一个URL进入,分析这个网页中的URL,一个链接一个链接地抓取下去,直到处理完一条路线之后再处理下一条URL中的路线。

例如,下图中深度优先搜索的遍历方式时 A 到 B 到 D 到 E 到 F(ABDECF),而宽度优先搜索的遍历方式是 A B C D E F 。

3、最佳优先搜索:

按照一定的网页分析法,预测候选URL与目标网页的相似度,或者与主题的相关性,并选取评价最好的一个或几个URL进行抓取。

4、反向链接数策略:

反向链接数是指一个网页被其他网页链接指向的数量。反向链接数表示的是一个网页的内容受到其他人的推荐程度。

5、Partial PageRank策略:

Partial PageRank算法借鉴了PageRank算法的思想,对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。

五、网页抓取的方法

1、分布式爬虫

用于目前互联网中海量URL管理,它包含多个爬虫(程序),每个爬虫(程序)需要完成的任务和单个爬行器类似。它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行。由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL发送给其他爬虫。

这些爬虫可能分布在同一个局域网之中,或分散在不同地理位置。

现在比较流行的分布式爬虫:

  • Apache Nutch: 依赖hadoop运行,hadoop本身会消耗很多时间。Nutch是为搜索引擎设计的爬虫,如果不是要做搜索引擎,尽量不要选择Nutch。

2、Java爬虫

用Java开发的抓取网络资源的小程序,常用的工具包括Crawler4j、WebMagic、WebCollector等。

3、非Java爬虫

  • Scrapy: 由Python编写的,轻量级的、高层次的屏幕抓取框架。最吸引人的地方在于Scrapy是一个框架,任何使用者可以根据自己的需求进行进行修改,并具有一些高级函数,可以简化抓取过程。

六、项目实战

1、抓取指定网页

抓取某网首页

使用urllib模块,此模块提供了读取Web页面数据接口,可以像读取本地文件一样读取www和ftp上的数据。urllib是一个URL处理包,这个包中集合了一些处理URL的模块。

  1. urllib.request 模块: 用来打开和读取URLs的。
  2. urllib.error 模块: 包含一些由 urllib.request 产生的错误,可以用try进行捕捉处理。
  3. urllib.parse 模块: 包含一些解析 URLs的方法。
  4. urllib.robotparser: 用来解析 robots.txt 文本文件。它提供了一个单独的 RobotFileParser 类,通过该类提供的 can_fetch() 方法测试爬虫是否可以下载一个页面。

以下代码为抓取某网页的代码:

import urllib.request

url = "https://www.douban.com/"
# 这边需要模拟浏览器才能进行抓取
headers = 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
data = response.read()
# 这边需要转码才能正常显示
print(str(data, 'utf-8'))

# 下面代码可以打印抓取网页的各类信息
print(type(response))
print(response.geturl())
print(response.info())
print(response.getcode())

2、抓取包含关键词网页

代码如下:

import urllib.request

data = 'word': '海贼王'
url_values = urllib.parse.urlencode(data)
url = "http://www.baidu.com/s?"
full_url = url + url_values
data = urllib.request.urlopen(full_url).read()
print(str(data, 'utf-8'))

3、下载贴吧中图片

代码如下:

import re
import urllib.request

# 获取网页源代码
def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read()
    return html

# 获取网页所有图片
def getImg(html):
    reg = r'src="([.*\\S]*\\.jpg)" pic_ext="jpeg"'
    imgre = re.compile(reg)
    imglist = re.findall(imgre, html)
    return imglist


html = getHtml('https://tieba.baidu.com/p/3205263090')
html = html.decode('utf-8')
imgList = getImg(html)
imgName = 0
# 循环保存图片
for imgPath in imgList:
    f = open(str(imgName) + ".jpg", 'wb')
    f.write((urllib.request.urlopen(imgPath)).read())
    f.close()
    imgName += 1
    print('正在下载第 %s 张图片 ' % imgName)
print('该网站图片已经下载完')

4、股票数据抓取

代码如下:

import random
import re
import time
import urllib.request

# 抓取所需内容
user_agent = ["Mozilla/5.0 (Windows NT 10.0; WOW64)", 'Mozilla/5.0 (Windows NT 6.3; WOW64)',
              'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
              'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
              'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',
              'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko)',
              'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12',
              'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6',
              'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)',
              'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)',
              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)',
              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/4.0.6.2000 Chrome/26.0.1410.43 Safari/537.1 ',
              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; QQBrowser/7.3.9825.400)',
              'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 ',
              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.92 Safari/537.1 LBBROWSER',
              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; BIDUBrowser 2.x)',
              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/3.0 Safari/536.11']

stock_total = []
headers = 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
for page in range(1, 8):
    url = 'http://quote.stockstar.com/stock/ranklist_a_3_1_' + str(page) + '.html'
    request = urllib.request.Request(url=url, headers="User-Agent": random.choice(user_agent))
    response = urllib.request.urlopen(request)
    content = str(response.read(), 'gbk')
    pattern = re.compile('<tbody[\\s\\S]*</tbody')
    body = re.findall(pattern, str(content))
    pattern = re.compile('>(.*?)<')
    # 正则匹配
    stock_page = re.findall(pattern, body[0])
    stock_total.extend(stock_page)
    time.sleep(random.randrange(1, 4))
# 删除空白字符
stock_last = stock_total[:]
print(' 代码', '\\t', ' 简称', '\\t', '最新价', '\\t', '涨跌幅', '\\t', '涨跌额', '\\t', '5分钟涨幅')

for i in range(0, len(stock_last), 13):
    print(stock_last[i], '\\t', stock_last[i + 1], '\\t', stock_last[i + 2], '   ', '\\t', stock_last[i + 3], '   ', '\\t',
          stock_last[i + 4], '\\t', stock_last[i + 5])

六、结语

以上使用Python版本为 3.9。

本篇内容参考自《Python3 数据分析与机器学习实战》一书,编写此篇以学习为主。

都看到这儿啦,来个一键三连呗 (´▽`ʃ♡ƪ)

写完就有点懒洋洋的咩~(+ω+)

python爬虫之scrapy框架系列——项目实战某瓣top250电影信息获取(代码片段)

目录:1.某瓣电影top250首页电影信息的获取!1.创建项目:2.创建爬虫文件:3.运行爬虫文件:4.设置请求头:5.获取到电影名字:5.1使用shell交互式平台:5.1.1首先:打开我们的shell交互式平台。5.2... 查看详情

python爬虫之scrapy框架系列——项目实战某瓣top250电影所有信息的txt文本存储(代码片段)

上篇文章已经成功解析提取到豆瓣Top250电影想要的所有数据。下一步就是将其交给管道进行存储。目录:1.编写items.py文件(定义结构化数据字段)2.爬虫文件里将数据一一对应字段名:3.将数据返回给管道:4.... 查看详情

python爬虫之scrapy框架系列——项目实战某瓣top250电影所有信息的txt文本存储(代码片段)

上篇文章已经成功解析提取到豆瓣Top250电影想要的所有数据。下一步就是将其交给管道进行存储。目录:1.编写items.py文件(定义结构化数据字段)2.爬虫文件里将数据一一对应字段名:3.将数据返回给管道:4.... 查看详情

机器学习网络爬虫实战详解(代码片段)

...级博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC)志愿者,以及编程爱好者,期待和大家一起学习,一起进步~.博客主... 查看详情

详解dockerfile之实战项目(代码片段)

docker的使用过程:它分为镜像构建与容器启动dockerfile:镜像的构建过程。即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用dockerfile来完成的。然后执行dockerbuild.就能制作镜像。从上往下... 查看详情

〖python网络爬虫实战⑤〗-session和cookie介绍(代码片段)

...他专栏。免费阶段订阅量1000+                python项目实战                Python编程基础教程系列(零基础小白搬砖逆袭)说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅... 查看详情

python网络爬虫实战:抖音短视频去水印爬虫详解(代码片段)

我们知道,在抖音APP中下载到的视频是有水印的,这就催生出了很多抖音短视频去水印的解析网站,小程序等。所以说,抖音短视频去水印这个东西并不是什么新鲜玩意儿,甚至你可以很轻松的在网上搜到抖... 查看详情

python爬虫从入门到放弃,网络爬虫应用实战(代码片段)

python爬虫应用Request库get方法Request对象Response对象session会话对象正则匹配re.match()方法例题:bugku-web基础$_POST例题:bugku-速度要快例题:bugku-秋名山老司机例题:bugku-cookies欺骗Request库get方法Pythonrequests库的get()方法... 查看详情

python爬虫从入门到放弃,网络爬虫应用实战(代码片段)

python爬虫应用Request库get方法Request对象Response对象session会话对象正则匹配re.match()方法例题:bugku-web基础$_POST例题:bugku-速度要快例题:bugku-秋名山老司机例题:bugku-cookies欺骗Request库get方法Pythonrequests库的get()方法... 查看详情

python爬虫从入门到放弃(十三)之scrapy框架的命令行详解(代码片段)

...t1NewScrapyproject‘test1‘,usingtemplatedirectory‘/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/scrapy/templates/project‘,createdin:/Users/zhaofan/Documents/python_project/spider/test1Youcanstartyourfirstspiderwith:cdtest1scrapygenspiderexampleexample.comlocalh... 查看详情

python3网络爬虫:初识网络爬虫之夜探老王家(2020年最新版)(代码片段)

一、前言3年前,我在csdn写过Python3网络爬虫系列教程,经过三年的积累,累计阅读量近90W。同时,我也在Github开源了所有Python3网络爬虫代码,累积获得10.3k+的star,4.1k+的fork。可以说,这个系列教... 查看详情

python爬虫编程思想:实战案例:抓取所有的网络资源(代码片段)

       Python爬虫编程思想(7):实战案例:抓取博客文章列表         到现在为止,我们已经对网络爬虫涉及到的基本知识有了一个初步的了解。本文会编写一个简单的爬虫应用,以便让读者对爬... 查看详情

新手必学python爬虫之scrapy框架案例详解

 Scrapy简介Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方... 查看详情

python爬虫4万字,详解selenium从入门到实战错过再无(代码片段)

👉跳转文末👈获取实战源码与作者联系方式,共同学习进步文章目录简介selenium安装安装浏览器驱动确定浏览器版本下载驱动定位页面元素打开指定页面id定位name定位class定位tag定位xpath定位css定位link定位partial_link定... 查看详情

python网络爬虫之scrapy框架(crawlspider)(代码片段)

目录Python网络爬虫之Scrapy框架(CrawlSpider)CrawlSpider使用爬取糗事百科糗图板块的所有页码数据Python网络爬虫之Scrapy框架(CrawlSpider)提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?方法一... 查看详情

〖python网络爬虫实战⑨〗-正则表达式基本原理(代码片段)

...专栏。免费阶段订阅量1000+                 python项目实战                Python编程基础教程系列(零基础小白搬砖逆袭)说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本... 查看详情

python爬虫详解(代码片段)

python爬虫详解1、基本概念1.1、什么是爬虫  网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展,万维网... 查看详情

python爬虫实战:1000图库大全别轻易点进来(代码片段)

......效果展示工具准备开发工具:pycharm开发环境:python3.7,Windows11使用工具包:requests项目解析思路获取当当前网页的跳转地址,当 查看详情