爬虫实战|使用scrapy框架爬取动态网页并保存

咱就是说,网络爬虫技术是真的香阿!

网络爬虫学了也已有三个月了,接下来进行实训考察一下效果如何把!

这次我们选择爬取 “当当” 官方网页,网址“www.dangdang.com”(你也可以选择别的网站)

接下来开始我们的一顿猛操作~

一、新建项目和爬虫文件,构建scrapy框架(这里我们把项目名称命名为 “dangdang”)

1、在你“特定的文件夹中”打开cmd,输入以下代码

scrapy startproject dangdang

如果显示和我一样的信息,就说明项目创建成功 

 2、创建spider,输入以下代码,注意:“cp”是爬虫名,“dangdang.com”是start_url,必不可少

(这里我们把spider名称命名为 “cp”,我选择爬取微机原理和接口设计这类图书,你也可以挑选别的图书种类 )

先进入创建的项目“dangdang”里面,再创建spider

>cd dangdang
>scrapy genspider cp dangdang.com

如果你显示的信息和我一样,说明spider创建成功

3、打开“pycharm”,打开刚刚创建的“dangdang”项目,把selenium下的chromedriver.exe放在此项目里,然后,新建调试“main.py”文件,是这样滴:

注意:请记住!!!

一定要把“chromedriver.exe”和新创建的“main.py”放在项目“dangdang”的根目录下!!!

 OK,scrapy框架搭建好了,接下来就是编写代码~

二、创建“main.py”,并编写内容

from scrapy.cmdline import execute
execute("scrapy crawl cp".split())

两行代码敲完之后,先搁置一边

三、修改默认给出的“middleware.py”

找到“class DangdangDownloaderMiddleware:”下的“def process_exception(self, request, exception, spider):”,输入以下代码:

        #创建浏览器实例化对象在爬虫文件中,用spider.bro调用
        bro = spider.bro

        #requst.url就是拦截到的爬虫文件发起的url
        bro.get(request.url)

        #获取页面源码
        page = bro.page_source

        #利用HtmlResponse()实例化一个新的响应对象
        n_response = HtmlResponse(url=request.url,body=page,encoding='utf-8',request=request)

        #返回新的响应对象
        return n_response

四、全局配置“settings.py”

打开“settings.py”文件,

注意:以下所有需要设置的地方仅需去掉前边的注释号即可(除日志输出)

1、设置要爬取网站的“user_agent”,获取当当网的“user_agent”,复制至此

2、设置—是否遵守robots.txt

默认是“True”,即“遵守”,在Scrapy启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。

然而,我们并不是在做搜索引擎,而且在某些情况下我们想要获取的内容恰恰是被 robots.txt 所禁止访问的。所以,某些时候,我们就要将此配置项设置为 False ,拒绝遵守 Robot协议 !

 3、设置输出日志信息为错误日志信息,以及输出错误级别为一般级别

#输出日志设为之输出发生错误的日志信息
#输出级别——一般级别
LOG_LEVEL = 'ERROR'
  • CRITICAL - 严重错误
  • ERROR - 一般错误
  • WARNING - 警告信息
  • INFO - 一般信息
  • DEBUG - 调试信息
     

4、设置下载中间件,

5、设置Item Pipeline

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。以下是Item Pipeline的一些典型应用:

  • 验证爬取的数据(检查item包含某些字段,比如说name字段)
  • 查重(并丢弃)
  • 将爬取结果保存到文件或者数据库中

 五、修改默认给出的“items.py”

1、Item对象是用于收集所抓取的数据的简单容器。

要爬取哪些字段,在爬虫解析页面时仅能使用已定义的这些字段,所以就需要在items.py中定义

2、在Item当中,它只有Field这一种类型,这个Field表示任何传递进来的数据类型都可以接收的

3、下图是默认已经给出的

 我们想要爬取当当网中《微机原理与接口设计》的书名,作者,现价,日期,出版社,所以需要在items.py中定义这些字段

 

 六、修改默认给出的“pipelines.py”

下图是默认给出的

我们想要将爬取的信息储存到".xls",需改写此文件

from itemadapter import ItemAdapter
from openpyxl import Workbook


class DangdangPipeline:
    def __init__(self):
        self.wb = Workbook()
        self.ws = self.wb.active
        self.ws.append(['书名','作者','现价','日期','出版社'])

    def process_item(self, items, spider):
        line = [items['book_name'],items['author'],items['price'],items['time'], items['press']]
        self.ws.append(line)
        self.wb.save('./微机原理与接口设计.xls')
        return items

 重头戏来了!!!

七、编写spider——“cp.py”文件中的主代码

1、下图是默认给出的结构,接下来就我们需要补充,修改

 2、此次实训完整代码

注意理解注释~

import scrapy
import time

from selenium import webdriver
from dangdang.items import DangdangItem


class CpSpider(scrapy.Spider):
    name = 'cp' #指定爬虫文件名称
    allowed_domains = ['dangdang.com']  #允许爬取的网站域名
    #spider在启动时爬取的url列表,用于定义初始请求
    #第一个要爬取的url
    start_urls = ['http://search.dangdang.com/?key=%CE%A2%BB%FA%D4%AD%C0%ED%D3%EB%BD%D3%BF%DA%BC%BC%CA%F5&act=input&page_index=1']
    page_index = 1  #第一页
    offset = 1  #查询字符串参数


    def __init__(self): #实例化浏览器对象
        #selenium启动配置参数接收是ChromeOptions类
        option = webdriver.ChromeOptions()  #启动浏览器,最大化
        #屏蔽谷歌浏览器正在接受自动化软件控制提示
        option.add_experimental_option('excludeSwitches', ['enable-authmation'])
        self.bro = webdriver.Chrome(options=option) #初始化


    def parse(self, response):

        items = DangdangItem()
        lists = response.xpath('//*[@id="search_nature_rg"]/ul/li')

        #遍历列表
        for i in lists:
            items['book_name'] = i.xpath('./p[@class="name"]/a/@title')[0].extract()
            print('书名',items['book_name'])

            author = i.xpath('./p[@class="search_book_author"]/span[1]//text()').extract()
            author = ''.join(author).strip()
            items['author'] = author
            print("作者",items['author'])

            items['price'] = i.xpath('./p[@class="price"]/span[1]/text()').get()
            print('现价',items['price'])

            items['time'] = i.xpath('./p[@class="search_book_author"]/span[2]/text()').get()
            print('日期',items['time'])

            items['press'] = i.xpath('./p[@class="search_book_author"]/span[3]/a/@title').get()
            print('出版社',items['press'])
            yield items #回调
        time.sleep(5)

        #通过parse()方法实现翻页
        if self.offset < 6: #只爬取5页
            self.offset += 1
            self.page_index += 1
            url='http://search.dangdang.com/?key=%CE%A2%BB%FA%D4%AD%C0%ED%D3%EB%BD%D3%BF%DA%BC%BC%CA%F5&act=input&page_index={}'
                .format(self.offset,self.page_index)
            yield scrapy.Request(url=url,callback=self.parse)

    #关闭浏览器
    def closed(self,spider):
        self.bro.close()

3、查看存储在表格中的内容

成功运行没有错误之后,将会把你所爬取的内容保存在“微机原理与接口设计.xls”表格中

双击打开表格,就是你所爬取的内容拉!

恭喜你完成此次实战!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>