Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")

1、Web Spider简介

Web Spider,又称为网络爬虫,是一种自动抓取互联网网页信息的机器人。它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。

2、一个简单的网络爬虫案例

作者在浏览网页的时候看到豆瓣书单的网页(首页),如下所示:

因为书单共有409本书,17个页面,若是要一个个浏览完,需要较长的时间,想要保存好书单,那是一件比较困难的事情,因此,想到是不是可以利用爬虫(Web Spider)把书名都保存下来,说干就干,下面详细介绍一下如何利用Python爬取书单。

3、单页面的抓取和分析

3.1、抓取

首先是单个页面的抓取,这里使用到了Python的urllib2库,urllib2库将网页以HTML的形式抓取到本地,代码如下:

def spider(url, user_agent="wswp"):
    print "Downloading: ", url
    # 设置代理
    headers = {"User-agent": user_agent}
    request = urllib2.Request(url, headers=headers)
    html = ""
    try:
        html = urllib2.urlopen(request).read()
    except urllib2.URLError as e:
        print "Download error: ", e.reason
        html = None
    return html

在抓取的过程中,使用到了Request方法,urlopen方法和read方法。通过以上简单的抓取,将网页以HTML的格式抓取到本地。

3.2、对抓取的页面分析

在分析模块中主要是使用到了正则表达式,使用到了Python中的re库,利用正则表达式提取出书的名字,如:

页面的分析代码如下:

def parse_page(html):
    html = html.replace("\r", "")
    html = html.replace("\n", "")
    html = html.replace("\013", "")
    result = re.findall(‘<div class="title">(.*?)</div>‘, html)
    book_list = []

    for x in result:
        # 得到书名
        book_name = re.findall(‘<a.*?>(.+)</a>‘, x.strip())
        book_list.append(book_name[0].strip())
    return book_list

最终得到了页面上的25本书的名字,如下:

3.3、主过程

在整个过程中使用到的模块为:

import urllib2
import re

主过程为:

if __name__ == "__main__":
    seed = "https://www.douban.com/doulist/1264675/?start=0&sort=seq&sub_type="
    html = spider(seed)
    book_list = parse_page(html)
    print len(book_list)
    for x in book_list:
        print x

4、抓取完整的书单

上面介绍了抓取其中一个页面的过程,为了能够抓取到完整的目录,需要解析所有的网页的网址,并对每一个网址都进行抓取,其中,网页的网址在页面下方的导航中:

在HTML代码中的格式为:

因此需要在分析模块中增加分析网址的功能,因此改进后的parse_page函数为:

def parse_page(html, url_map):
    # 1、去除无效的字符
    html = html.replace("\r", "")
    html = html.replace("\n", "")
    html = html.replace("\013", "")

    # 2、解析出书名
    result_name = re.findall(‘<div class="title">(.*?)</div>‘,html)

    book_list = []
    for x in result_name:
        # 提取出书名
        book_name = re.findall(‘<a.*?>(.+)</a>‘, x.strip())
        book_list.append(book_name[0].strip())

    # 3、解析出还有哪些网址
    result_url = re.findall(‘<div class="paginator">(.*?)</div>‘, html)
    url_list = re.findall("[a-zA-z]+://[^\s\"]*", result_url[0])
    for x in url_list:
        x = x.strip()
        if x not in url_map:
            url_map[x] = 0
    return book_list, url_map

在解析出书名后,解析出网址。

4.2、控制

在利用函数parse_page函数抓取一个网页后,分析出网页中的书单,同时,将网页中链向其他页面的网址提取出来,这样,我们需要一个控制模块,能够对提取出的网址依次抓取,分析,提取。这样的控制模块的代码如下:

def control(seed):
    # 设置map用于记录哪些网址需要爬取
    url_map = {}
    book_list = []
    # 爬取种子网址
    html = spider(seed)
    url_map[seed] = 1 #种子网址已经爬取过
    # 解析种子网址
    book_tmp, url_map = parse_page(html, url_map)
    for x in book_tmp:
        book_list.append(x)

    # 对url_map中的的网址依次爬取
    while True:
        for k, v in url_map.items():
            if v == 0:
                # 爬取
                html = spider(k)
                url_map[k] = 1
                book_tmp, url_map = parse_page(html, url_map)
                for x in book_tmp:
                    book_list.append(x)
                break
            else:
                continue
        if 0 not in url_map.values():
            break
    return book_list

通过一个map存储所有页面的网址,key为网址,value为是否抓取过,0表示未抓取,1表示的是已抓取过。通过循环分析该map,直到所有的key对应的页面都被抓取过为止。

4.3、主函数

主函数为:

if __name__ == "__main__":
    seed = "https://www.douban.com/doulist/1264675/?start=0&amp;sort=seq&amp;sub_type="
    book_list = control(seed)
    print len(book_list)
    for x in book_list:
        print x

最终抓取到的书单的个数为408个,但是首页上显示有409本:

调研发现有一本书没有:

因此,整个抓取没有问题。

最终的书单的部分如下:

在上面实现了一个简单的爬虫,当然,想要抓取更多更复杂的网站,这个爬虫是不行的,接下来,我们会慢慢深入到爬虫的更多的技术。

时间: 2024-12-23 12:36:58

Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")的相关文章

Python爬虫入门 | 爬取豆瓣电影信息

这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬虫的大门啦~好啦,正式开始我们的第二节课<爬取豆瓣电影信息>吧!啦啦哩啦啦,都看黑板~1. 爬虫原理1.1 爬虫基本原理听了那么多的爬虫,到底什么是爬虫?爬虫又是如何工作的呢?我们先从"爬虫原理"说起.爬虫又称为网页蜘蛛,是一种程序或脚本.但重点在于:它能够按照一定的规则,自动

第一个nodejs爬虫:爬取豆瓣电影图片

第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require('https'); //使用https模块 var fs = require('fs');//文件读写 var cheerio = require('cheerio');//jquery写法获取所得页面dom元素 var request = require('request');//发送reques

Python爬虫 爬取豆瓣读书

最近用Python写了个豆瓣读书的爬虫玩,方便搜罗各种美美书,分享给大家 实现功能: 1 可以爬下豆瓣读书标签下的所有图书 2 按评分排名依次存储 3 存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍:可依据不同的主题存储到Excel不同的Sheet 4 采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封 试着爬了七八万本书,存在了book_list.xlsx中,结果截图如下: 详细代码和爬取的一些结果可移步到GitHub

爬虫入门-4-2.爬取豆瓣读书图片

一.利用lxml解析 from lxml import etree import os import requests PROXY = { 'HTTPS': '116.209.55.208:9999' } def spider(): url = 'https://book.douban.com/latest?icn=index-latestbook-all' response = requests.get(url, proxies=PROXY) html = etree.HTML(respons

java的简单网络爬虫(爬取花瓣网的图片)

因为本人对爬虫比较感兴趣,加上之前也写过一些简单的python爬虫,所以在学完java基础后写了一个简单的网络图片爬虫.废话不多说直接上过程代码.(爬取的图源来自花瓣网:https://huaban.com/boards/favorite/beauty/) 源url页面分析 拿到爬取的源url,首先是分析页面哪些东西是要爬取的,这个页面是美女分类的画板页面,这里我们要爬的就是要爬取某个画板下面的所有图片.这里为了简单爬取我就选取了该页面推荐的几个画板.查看本页面源码可以很快找到推荐画板的url资

爬虫之爬取豆瓣热门图书的名字

import requests #requests模块用于HTTP请求 import codecs #codecs模块用于文件操作 from bs4 import BeautifulSoup #beautifulSoup库用于对html代码进行解析 #要爬取的地址 URL="https://book.douban.com/top250" #user-agent,模仿浏览器,防止被目标网站反爬 HEADERS = { "User-Agent":"Mozill

团队-张宸-需求分析-python爬虫分类爬取豆瓣电影

首先要明白爬网页实际上就是:找到包含我们需要的信息的网址(URL)列表通过 HTTP 协议把页面下载回来从页面的 HTML 中解析出需要的信息找到更多这个的 URL,回到 2 继续其次还要明白:一个好的列表应该:包含足够多的电影的 URL通过翻页,可以遍历到所有的电影一个按照更新时间排序的列表,可以更快抓到最新更新的电影最后模拟过程知道豆瓣网站不能一次性爬取所有信息,只能分类爬取使用工具pyspider分析完成实现代码,测试模拟运行,按照时间列表爬取每类最新电影资讯团队成员:张文然,张宸

团队-张文然-需求分析-python爬虫分类爬取豆瓣电影信息

首先要明白爬网页实际上就是:找到包含我们需要的信息的网址(URL)列表通过 HTTP 协议把页面下载回来从页面的 HTML 中解析出需要的信息找到更多这个的 URL,回到 2 继续其次还要明白:一个好的列表应该:包含足够多的电影的 URL通过翻页,可以遍历到所有的电影一个按照更新时间排序的列表,可以更快抓到最新更新的电影最后模拟过程知道豆瓣网站不能一次性爬取所有信息,只能分类爬取使用工具pyspider分析完成实现代码,测试模拟运行,按照时间列表爬取每类最新电影资讯 代码分解,便于加入团队后组员

爬虫实践-爬取豆瓣音乐TOP250的数据

doubanyinyue.py: import requestsfrom lxml import etreeimport reimport pymongoimport time client = pymongo.MongoClient('localhost', 27017)mydb = client['mydb']musictop = mydb['musictop'] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) A