python 爬虫练习--scrapy框架

1、安装scrapy框架

1. pip install scrapy。
2. 可能会出现问题:
    * 在ubuntu下要先使用以下命令安装依赖包:`sudo apt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev`,安装完成后再安装`scrapy`。
    * 在windows下安装可能会提示`No module named win32api`,这时候先使用命令:`pip install pypiwin32`,安装完成后再安装`scrapy`。
    * 在windows下安装Scrapy可能会提示`twisted`安装失败,那么可以到这个页面下载`twisted`文件:`https://www.lfd.uci.edu/~gohlke/pythonlibs/`,下载的时候要根据自己的Python版本来选择不同的文件。下载完成后,通过`pip install xxx.whl`

2、创建项目

1. 创建项目:`scrapy startproject [项目名称]`.
2. 创建爬虫:`cd到项目中->scrapy genspider [爬虫名称] [域名]`.

3、配置python解释器

在这里插入图片描述

4、scrapy常见命令

创建项目:scrapy startproject xxx
进入项目:cd xxx #进入某个文件夹下
创建爬虫:scrapy genspider xxx(爬虫名) xxx.com (爬取域)
生成文件:scrapy crawl xxx -o xxx.json (生成某种类型的文件)
运行爬虫:scrapy crawl XXX
列出所有爬虫:scrapy list
获得配置信息:scrapy settings [options]

5、框架结构

放置 spider 代码的目录文件 spiders(用于编写爬虫)。
项目中的 item 文件 items.py(用于保存所抓取的数据的容器,其存储方式类似于 Python 的字典)。
项目的中间件
middlewares.py(提供一种简便的机制,通过允许插入自定义代码来拓展 Scrapy 的功能)。
项目的 pipelines 文件 pipelines.py(核心处理器)。
项目的设置文件 settings.py。
项目的配置文件 scrapy.cfg。

6、抓取多个item 返回多pipeline的处理

两个item

import scrapy


class XieItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
class ComItem(scrapy.Item):
    url=scrapy.Field()

两个pipeline

from itemadapter import ItemAdapter
from .items import XieItem,ComItem
# from .items import ComItem

class XiechengNewPipeline:
    def process_item(self, item, spider):
        print(item['name'])
class ComchengNewPipeline:
    def process_item1(self, item, spider):
        print(item['url'],'11111')

管道文件配置

ITEM_PIPELINES = {
   'xiecheng_new.pipelines.XiechengNewPipeline': 200,
   'xiecheng_new.pipelines.ComchengNewPipeline': 300,
}

后面的数字是多少无所谓但是别重复就是,那个是优先级,这样写完代码会发现,item都返回给第一个管道文件,不会进入到第二个管道。
那么我们怎么解决呢,如果只想只有单个管道配置跟单个爬虫文件的话,直接通过判断item类型来进行存储数据,
代码如下,

from itemadapter import ItemAdapter
from .items import XieItem,ComItem
# from .items import ComItem

class XiechengNewPipeline:
    def process_item(self, item, spider):
        if type(item)==XieItem:
            print(item['name'])
class ComchengNewPipeline:
    def process_item1(self, item, spider):
        if type(item)==ComItem:
            print(item['url'],'11111')

但是多个文件不想使用一个通道时候就要使用另一个方法了,这种情况在多个爬虫时候好用,但是单个爬虫还是老老实实的的判断item类型就好了,
多管道方法如下,
在爬虫的开头直接增加配置

import scrapy
from ..items import XieItem,ComItem
# from ..items import ComItem
class DmozSpider(scrapy.Spider):
    name = "ca"
    allowed_domains = ["wensong.xyz/"]
    start_urls = [
        'http://wensong.xyz/',
    ]
    custom_settings = {
        'ITEM_PIPELINES' : {
        'xiecheng_new.pipelines.ComchengNewPipeline': 300}
    }
    def parse(self, response, **kwargs):
        item=XieItem()
        url = response.xpath('//title//text()').getall()[0]
        item['name']=url
        yield item
        item1=ComItem()
        url1 = 'http://wensong.xyz' + response.xpath('//p//a//@href').getall()[0]
        item1['url'] = url1
        yield item1

学习链接:https://blog.csdn.net/weixin_43927238/article/details/108280310

7、多页面爬取携带参数

 def parse(self, response):
     # collect `item_urls` 
     for item_url in item_urls:
         yield Request(url=item_url, callback=self.funcA)

 def funcA(self, response):
     item = MyItem()
     # 处理列表数据
     yield Request(url=item_details_url, meta={'item': item},
            callback=self.funcB)

 def funcB(self, response):
     item = response.meta['item']
     # 处理新闻详情页的数据
     yield Request(url=item_details_url, meta={'item': item},
            callback=self.funcC)

  def funcC(self, response):
     item = response.meta['item']
     # 处理新闻解说页的数据
     return item

传递多个参数

yield Request(url, meta={'item': item, 'itemB': itemB, 'itemC':itemBC}, callback=self.parse)

取出参数

           item = response.meta['item']
           itemB = response.meta['itemB']
           itemC = response.meta['itemC']

学习链接:https://blog.csdn.net/showhilllee/article/details/72871141
http://c.biancheng.net/view/2027.html
https://blog.csdn.net/qq_41837900/article/details/96489994

8、scrapy如何顺序执行多个爬虫

scrapy如何单线程顺序执行多个爬虫,刚开始我天真的以为将多个excute顺序罗列就能依次执行每个爬虫了,代码如下所示:

from scrapy.cmdline import execute

execute("scrapy crawl huanqiu_finance".split())  # 环球网
execute("scrapy crawl ztcj".split())  # 智通财经网
execute("scrapy crawl p5w".split())  # 全景网
execute("scrapy crawl cs".split())  # 中国证券网
execute("scrapy crawl ccstock".split())  # 证券日报
execute("scrapy crawl ddxsb".split())  # 读懂新三板
execute("scrapy crawl xinhuanet".split())  # 新华网
execute("scrapy crawl money163".split())  # 网易财经

在这里插入图片描述

拓展:如何实现多个爬虫循环顺序爬取
首先设置一个循环,接着为每一个爬虫设置一个定时器,让每一个爬虫爬虫一段时间,再运行下一个爬虫即可。具体代码如下,此处设置每一个爬虫运行3600秒

import os

while True:
    os.system("scrapy crawl xinhuanet -s CLOSESPIDER_TIMEOUT=3600")  # 新华网
    os.system("scrapy crawl money163 -s CLOSESPIDER_TIMEOUT=3600")  # 网易财经
    os.system("scrapy crawl ccstock -s CLOSESPIDER_TIMEOUT=3600")  # 证券日报
    os.system("scrapy crawl cs -s CLOSESPIDER_TIMEOUT=3600")  # 中证网
    os.system("scrapy crawl p5w -s CLOSESPIDER_TIMEOUT=3600")  # 全景网
    os.system("scrapy crawl ztcj -s CLOSESPIDER_TIMEOUT=3600")  # 智通财经
    os.system("scrapy crawl huanqiu_finance -s CLOSESPIDER_TIMEOUT=3600")  # 环球财经

https://www.jianshu.com/p/6e0c24bc4699?utm_source=oschina-app

9、读取scrapy配置文件setting.py中的方法

from scrapy.utils.project import get_project_settings
settings = get_project_settings()
 
user_agents = settings['USER_AGENTS']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值