爬虫(九)--scrapy框架

一、scrapy框架

(一)安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy

(二)步骤

1.创建项目

在这里插入图片描述

在这里插入图片描述

2.配置

不遵循robot协议

在这里插入图片描述
请求头

在这里插入图片描述

3.编写想要获取的url,并测试

在这里插入图片描述

启动命令

scrapy crawl maoyan --nolog

在这里插入图片描述
在这里插入图片描述

4.设置想要提取的字段

在这里插入图片描述

5.实例化item对象

在这里插入图片描述

6.提取数据

在这里插入图片描述

extract_first()    # 提取出一个选择器的data值
extract_first()    # 提取出一个list中所有选择器data值,返回值为list

在这里插入图片描述

7.存入item对象

在这里插入图片描述

(三)目录结构

在这里插入图片描述

一定要严格按照这个目录结构,不然运行命令会发生找不到命令的情况。

二、scrapy框架图及组件

在这里插入图片描述
在这里插入图片描述

三、scrapy发送二次请求

在scrapy项目中,我们想要在parse方法中继续发送一个请求,请求其他url,可以通过yield一个scrapy.Requests()对象完成。这样scrapy引擎就会将它加入调度队列中进行下载,将下载好的结果传给该对象的callback参数锁对应的回调方法。

在这里插入图片描述

该对象还有一个meta参数,用来传递参数

在这里插入图片描述

四、保存数据

将提取完全的item,保存到MongoDB中。

1.传递

将提取完全的item,使用yield item传递给pipelines.py中的process_item(self, item, spider)函数处理。
在这里插入图片描述

2.配置

要想使用pipelines.py中的类来存储item,必须将该类配置到settings.py中。
在这里插入图片描述

3.存储

在这里插入图片描述
因为这个爬虫程序不止要执行一次,不能每次执行都重新获取一遍,要去重,即增量爬虫。

增量爬虫:让我们爬虫程序每次运行后,都能保证让数据库中数据稳定增长,不会出现重复。

所以给item增加一个datail_hash字段,保存detail_url的hash值。操作数据库时,使用update就可以使用这个字段快速查找是否存在该数据,有的话就更新,没有就插入。

五、自定义下载

即selenium+phantomjs

(一)步骤

1.创建一个MyMiddlerWare.py文件

在这里插入图片描述

2.创建一个类

这个类就是我们的下载中间件。当一个request在被下载器下载之前,使用这个中间件捕捉到它,可以提前对这个request做一些操作。当我们自己进行了下载之后,下载器发现就不会再下载了。

使用中间件的process_request方法。

def process_request(self, request, spider)

import time

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from scrapy.http import HtmlResponse

class MyMiddleWare(object):
    def __init__(self):
        self.driver = webdriver.PhantomJS()
        self.wait = WebDriverWait(self.driver,10)

    def process_request(self, request, spider):
        xpath = request.meta.get('xpath')
        self.driver.get(request.url)
        if xpath:
            self.wait.until(EC.presence_of_element_located((By.XPATH,xpath)))
        else:
            time.sleep(3)
        html = self.driver.page_source
        return HtmlResponse(url=request.url,body=html,encoding='utf-8',request=request)

3.配置

想要这个下载中间件生效,就要在settings.py中配置如下内容
在这里插入图片描述

六、scrapy设置初始请求的方法

(一)通过start_url

在这里插入图片描述

(二)通过start_requests()方法

在这里插入图片描述

这种方法的优点是可以手动设置url的一些request信息,比如可以自带meta参数,比如可以给它设置一些请求头。

七、scrapy中使用cookie

将cookie信息添加到请求头中。
在这里插入图片描述

scrapy默认会自己定义cookie信息,所以只将cookie设置到请求头中是不会生效的。

还需要设置禁用默认的cookie
在这里插入图片描述

八、LinkExtractor类

LinkExtractor类,能帮我们快速找到页面指定位置处的所有链接,且会将相关信息也获取到。

1.导包

from scrapy.linkextractors import LinkExtractor

2.创建一个le对象

对象接收的参数就是你想筛选链接的xpath,他会将你所传入xpath的页面元素中的所有链接及相关信息都筛选出来,这个参数是一个list,可以一次性接收多个xpath。

3.使用extract_links()方法取出

le = LinkExtractor(restrict_xpaths = ['//div[@class="l"]/ul/li/span[1]'])
links = le.extract_links(response)

在这里插入图片描述

4.取出url

for link in links循环这个links,使用link.url就能获取到url了。
在这里插入图片描述

九、日志

配置

LOG_FILE= 'biquge.log'    # 日志文件的名称
LOG_ENABLE  =True    # 开启日志
LGO_LEVEL = 'DEBUG'    # 日志等级
LOG_ENCODING = 'utf-8'    # 编码

5种日志等级

  • CRITICAL:严重错误
  • ERROR:一般错误
  • WARNING:警告信息
  • INFO:一般信息
  • DEBUG:调试信息

十、编写启动文件

在这里插入图片描述

from scrapy import cmdline
cmdline.execute('scrapy crawl biquge_spider --nolog'.split())

不用再输入命令,可以直接运行main.py文件运行项目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章