2020-2-26

1 Scrapy 执行流程

1、创建一个 Scrapy 项目
2、引擎从调度器取出一个 URL 用于抓取
3、引擎把 URL 封装成一个 Requests 请求然后传给下载器把相应结果下载下来并封装成应
答包
4、解析应答包
5、定义解析规则(Item)
6、根据定义规则解析内容后交给实体管道等待处理
7、解析出 URL 交给调度器继续等待被抓取

2 Scrapy 的运作流程

代码写好,程序开始运行…
1 引擎: Hi! Spider, 你要处理哪一个网站?
2 Spider:老大要我处理 xxxx.com。
3 引擎:你把第一个需要处理的 URL 给我吧。
4 Spider:给你,第一个 URL 是 xxxxxxx.com。
5 引擎: Hi!调度器,我这有 request 请求你帮我排序入队一下。
6 调度器:好的,正在处理你等一下。
7 引擎: Hi!调度器,把你处理好的 request 请求给我。
8 调度器:给你,这是我处理好的 request
9 引擎: Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个 request 请求
10 下载器:好的!给你,这是下载好的东西。(如果失败: sorry,这个 request 下载失败
了。然后引擎告诉调度器,这个 request 下载失败了,你记录一下,我们待会儿再下载)
11 引擎: Hi! Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你
自己处理一下(注意!这儿 responses 默认是交给 def parse()这个函数处理的)
12 Spider:(处理完毕数据之后对于需要跟进的 URL), Hi!引擎,我这里有两个结果,
这个是我需要跟进的 URL,还有这个是我获取到的 Item 数据。
13 引擎: Hi !管道 我这儿有个 item 你帮我处理一下!调度器!这是需要跟进 URL 你帮
我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
14 管道调度器:好的,现在就做!
注意!只有当调度器中不存在任何 request 了,整个程序才会停止,(也就是说,对于下
载失败的 URL, Scrapy 也会重新下载。)

3 制作 Scrapy 爬虫 一共需要 4 步:

  1. 新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
  2. 明确目标 (编写 items.py):明确你想要抓取的目标
  3. 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
  4. 存储内容 (pipelines.py):设计管道存储爬取内容

4 常用文件介绍

items.py:
定义的是你要存储的数据格式,这个格式叫做item
声明一些变量,用于存储抓取的数据
name = scrapy.Field()
pipelines.py:
主要是把你从网页提取出来的数据,存储到item之后,
你后续把这些变量数据要存储到哪里?
文本文件、excel文件、数据库
spiders目录下的xxx.py:例子:sohu.py
这个文件主要是把网页的那些数据提取出来,存到items.py
中定义的变量中。
三个py的关系:
setting.py:取消注释三句话
items.py:定义变量,变量用于存储从网页提取的数据
spider/sohu.py:网页下载后,从网页源码要提取那些数据
是这个文件决定的,决定存到哪个变量(items.py定义的)里
可以拿到了存储我们想要数据的变量了。
pipelines.py:定义了变量的数据怎么存储到文件里。
(文本、excel、数据库)

5 Scrapy 实战

(1)创建项目
cmd交互模式下,先进入想创建项目的目录,然后执行 scrapy startproject tutorial(tutorial为项目名称)
(2)创建spider
进入到项目根目录(tutorial),执行scrapy genspider sohu(spider名字) www.sohu.com(url地址) ,生成sohu.py
(3)定义筛选内容 items.py

import scrapy
class TutorialItem(scrapy.Item):
    # 定义项目的字段
    valid_link = scrapy.Field()#定义筛选有效连接对象模板
    invalid_link = scrapy.Field()#定义筛选无效连接对象模板

(4)定义爬虫方法 sohu.py

# -*- coding: utf-8 -*-
import scrapy
import re
from tutorial.items import TutorialItem
class SohuSpider(scrapy.Spider):
    name = "sohu"#项目名称
    allowed_domains = ["www.sohu.com"]#爬虫作用范围,主要作用于首页之后的页面
    start_urls = ["http://www.sohu.com"]#开始url
    def parse(self, response):
        for sel in re.findall(r'href="(.*?)"', response.xpath("/html").extract_first()):#对响应结果做正则筛选1
            item = TutorialItem()#获取item解析方法
            if re.findall(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$", sel.strip()):  # 资源连接筛选出来
                print (6, sel.strip())
                item['invalid_link']=sel.strip()#将爬取数据返回到items解析模板内,给字典的一个key赋值了
                yield item
            elif sel.strip().startswith("//"):
                item['valid_link'] = "".join(["http:",sel.strip()])#将爬取数据返回到items解析模板内=
                yield item
            else:   
                item['valid_link'] = sel.strip()#将爬取数据返回到items解析模板内=
                yield item#将数据更新到item对象并做输出,item.json文件里。

(5)保存爬取数据
执行 scrapy crawl sohu -o items.json 在项目中生成items.json文件
(6)设置保存匹配数据脚本
pipelines.py 项目根目录执行scrapy crawl sohu

import json
class TutorialPipeline(object):
    def __init__(self):
        self.filename = open("d://2019//url.txt","w")
    def process_item(self, item, spider):
        text = json.dumps(dict(item),ensure_ascii=False)+'\n'
        self.filename.write("result:"+text)
        return item
    def close_spider(self, spider):
        self.filename.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值