Scrapy中文手册

scrapy爬虫流程及各个部件作用

Scrapy入门

1.创建一个scrapy项目

scrapy startproject mySpider

2.生成一个爬虫

scrapy genspider example “example.com”

3.提取数据

完善spider,使用xpath等方法

4.保存数据

pipeline中保存数据

pipeline的使用

在pipelines.py 文件的process_item函数中实现存储方法

在settings.py 文件中取消ITEM_PIPELINES的注释开启部件 (位置:权重)

从pipeline的字典形式可以看出来,pipeline可以有多个,而且确实能定义多个。

原因:

  • 可能会有多个spider,不同的pipeline处理不同的item的内容
  • 一个spider的内容可能要做不同的操作,比如存入不同的数据库中

注意:

  • pipeline的权重越小优先级越高
  • pipeline中process_item方法名不能修改为其它名称

怎么在pipeline处理中区分数据来源:

  • 在获取数据时加入键值,来标记数据来源
  • 通过process_item函数中的spider参数来区分
  • 使用log,见下面log的使用
# 在获取数据时加入键值方法
class MyspiderPipeline(object):
    # 在这个函数中实现存储方法
    def process_item(self, item, spider):
        if item["come_from"] == "itcast":
            pass
        return item
# 通过process_item函数中的spider参数来区分
class MyspiderPipeline(object):
    # 在这个函数中实现存储方法
    def process_item(self, item, spider):
        if spider.name == 'itcast':
            pass
        return item

存入mongodb数据库

from pymongo import MongoClient
client = MongoClient()
collection = client["itcast"]['teacher']

class MyspiderPipeline(object):
    # 在这个函数中实现存储方法
    def process_item(self, item, spider):
        if spider.name == 'itcast':
            collection.insert(item)
        return item

open_spider和close_spider

前者在爬虫开启的时候执行,仅执行一次;后者在爬虫关闭的时候执行,仅执行一次

使用情景:开启数据库连接,关闭数据库连接

示例:在open_spider函数中添加属性后可以在其它类里引用

# Pipeline中定义属性
def open_spider(self,spider):
    spider.hello = "hello"
# 爬虫中使用
print(self.hello)

log的使用

在代码运行结果中输出warning或更高级内容

在settings.py 文件中添加 日志等级

# 设置日志等级
LOG_LEVEL = “WARNGING”

将log日志保存到本地

在settings.py 文件中添加 文件位置

注意:添加文件位置后代码运行结果中不再显示log信息

# 设置日志保存位置
LOG_FILE = “./log.log”

logging模块的使用

在日志中显示日志来源

import logging
# 实例化logger
logger = logging.getLogger(__name__)
# 在想要输出日志的位置
logger.warning(item)

设置日志的输出样式

参考网上进行设置

# 设置日志的输出样式
logging.basicConfig()

在其它文件中调用

# 引入其它文件中logger的样式
from log_style import logger
logger.warning(content)

实现翻页请求

next_url = response.xpath('//a[@id="next"]/@href').extract_first()
        if next_url:
            yield  scrapy.Request(
                next_url,
                callback=self.parse
            )

设置User-agent

# 在settings.py中取消USER_AGENT的注释,并将后面字符串改为新的User-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'

scrapy.Request 说明

meta参数使用示例:

    if next_url:
            yield  scrapy.Request(
                next_url,
                callback=self.parse1,
                meta={"item":item}
            )
    def parse1(self,response):
        response.meta["item"]

items.py的使用

注意:如果同时使用mongodb数据库需要在写入数据时将item转换为字典

# items.py
class MyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    title = scrapy.Field()
# spiders 构造数据
        for li in li_list:
            item = MyspiderItem()
            item['name'] = li.xpath(".//h3/text()").extract_first()
            item['title'] = li.xpath(".//h4/text()").extract_first()
            logger.warning(item)
            yield item

Github项目:爬取阳光热线问政平台

debug信息

Scrapy shell的使用

Scrapy shell是一个交互终端,可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath表达式

使用方法:

scrapy shell url

  • response.url:当前响应的url地址
  • response.request.url:当前响应对应的请求的url地址
  • response.headers:响应头
  • response.body:响应体,就是html代码,默认是bytes类型
  • response.requests.headers:当前响应的请求头

settings.py文件中定义变量并在其它文件中使用

  • from settings import 变量名
  • 调用响应的.settings[变量名]或.settings.get(变量名,None)

携带cookies模拟登录

class ItcastSpider(scrapy.Spider):
    name = 'itcast' # 爬虫名
    allowed_domains = ['itcast.cn'] # 允许爬取的范围
    start_urls = ['http://www.itcast.cn/channel/teacher.shtml']  # 最开# 始请求的url地址
# 设置cookies 字典类型
    cookies = {}
    # 重写start_requests函数
    def start_requests(self):
        yield scrapy.Request(url=self.start_urls,callback=self.parse,cookies=self.cookies)

# 查看cookies是否传递
# 在settings中添加该参数
# COOKIES_DEBUG = True

发表回复