240
我爱毛绒绒~~~~~~~

爬虫 - Scrapy框架安装使用2

Scrapy 框架其他方法功能集合笔记

使用Scrapy框架自带Item Pipeline下载文件和图片

使用ImagesPipeline 下载图片

1、 要下载Pillow 否则无法下载

2、item需要定义两个默认的,不能改!否则无法下载!

    image_urls = scrapy.Field()  ### 存储下载图片的链,需要传递一个列表
    images = scrapy.Field()  ###文件下载完成后,会把图片的相关信息存储到这个属性里,比如 下载的路径、下载的URL、文件的校验码 …

settings.py

### 开启ImagePipline
ITEM_PIPELINES = {
   'scrapy.pipelines.images.ImagesPipeline': 1,
}

###图片下载存储路径
IMAGES_STORE = 'img'
import scrapy
from ScrapyProject.items import GiftItem

from bs4 import BeautifulSoup
import json

class GiftsSpider(scrapy.Spider):
    name = "gifts"
    allowed_domains = ["www.hellorf.com"]
    start_urls = ["http://www.hellorf.com/"]

    def parse(self, response):
        item = GiftItem ()
        soup = BeautifulSoup(response.text, 'lxml')
        res = soup.find(id="__NEXT_DATA__").text
        URL = []
        res1 = json.loads(res)
        res2 = res1["props"]["pageProps"]["initialProps"]
        image_list = res2["KVS"]
        for i in image_list:
            URL.append(i.get('image'))
        cover_list = res2["inventions"]
        for i in cover_list:
            URL.append(i.get('cover'))
        res3 = res2["inspirationAtlas"]
        for i in res3:
            if i.get('topics'):
                topics_list = i.get('topics')
                for topic in topics_list:
                    URL.append(topic.get("short_cover"))

        item['image_urls'] = URL
        yield item

使用 FilesPipeline 下载文件

1、item需要定义两个默认的,不能改!

    file_urls = scrapy.Field()  
    files = scrapy.Field()  

settings.py

### 开启FilePipline
ITEM_PIPELINES = {
   'scrapy.pipelines.files.FilesPipeline': 1,
}

###图片下载存储路径
FILES_STORE = 'img'

使用LinkExtractor提取链接

使用Selector

import scrapy

from bs4 import BeautifulSoup

class BookSpider(scrapy.Spider):
    name = "book"
    allowed_domains = ["books.toscrape.com"]
    start_urls = ["http://books.toscrape.com/"]

    def parse(self, response):
        soup = BeautifulSoup(response.text,'lxml')
        urls = soup.find_all(class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
        for i in urls:
            ### 提取链接,得到没有域名的路径,如图一所示
            url = i.find(class_="image_container").a.attrs.get('href')
            print(url)
            ### 使用response.urljoin方法计算出绝对url地址,如图二所示
            URL = response.urljoin(url)
            print(URL)

使用LinkExtractor

 import scrapy
 from scrapy.linkextractors import LinkExtractor

 from bs4 import BeautifulSoup

 class BookSpider(scrapy.Spider):
     name = "book"
     allowed_domains = ["books.toscrape.com"]
     start_urls = ["http://books.toscrape.com/"]

     def parse(self, response):
         soup = BeautifulSoup(response.text,'lxml')
         urls = soup.find_all(class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
         for i in urls:
             ### 提取链接
             url = i.find(class_="image_container").a.attrs.get('href')
             ### 创建一个LinkExtractor对象,使用一个或多个构造器参数描述提取规则
             ### 如图一所示
             links = LinkExtractor(url)
             ### 调用LinkExtractor对象的extract_links方法传入一个Response对象,该方法依据创建对象时所描述的提取规则,
             ### 在Response对象所包含的页面中提取链接,最终返回一个列表,其中的每一个元素都是一个Link对象,即提取到的一个链接
             ### 如图二所示
             Link = links.extract_links(response)
             ### 得到最终链接
             ### 如图三所示
             print(Link[0].url)



使用Exporter导出数据

1、 在Scrapy中,负责导出数据的组件被称为Exporter(导出器)
2、 Scrapy内部实现了多个Exporter,每个Exporter实现一种数据格式的导出
3、 parse方法需要返回列表套字典

使用命令行参数指定

import scrapy

from bs4 import BeautifulSoup

class BookSpider(scrapy.Spider):
    name = "book"
    allowed_domains = ["books.toscrape.com"]
    start_urls = ["http://books.toscrape.com/"]

    def parse(self, response):
        booklist=[]
        soup = BeautifulSoup(response.text,'lxml')
        book_list = soup.find_all(class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
        for book in book_list:
            name = book.article.h3.a['title']
            price = book.find(class_="price_color").text
            booklist.append({'书名':name,'价格':price})
        ### 返回列表套字典
        return booklist

1、 -o 指定导出路径
2、 -t 指定导出文件类型,一般可以不写,scrapy爬虫可以通过文件后缀判断导出类型

### 终端执行命令如下:
scrapy crawl book -o b.csv

结果如下:

Scrapy框架中配置ip代理

可以先看下依赖库安装没有

pip install scrapy-proxies

设置单个代理ip

setttings

DOWNLOADER_MIDDLEWARES = {
    ### 项目名.middlewares名称(也可以自定义).类名
    'Film.mymiddlewares.HttpProxyMiddleware': 700,
}

### 设置代理服务器,格式为:http://user:password@host:port
HTTP_PROXY = 'http://121.40.62.167:3128'

mymiddlewares

from scrapy import signals

class HttpProxyMiddleware:
    def __init__(self, proxy):
        self.proxy = proxy

    @classmethod
    def from_crawler(cls, crawler):
        # 从Scrapy的配置中读取代理IP
        return cls(proxy=crawler.settings.get('HTTP_PROXY'))

    def process_request(self, request, spider):
        # 设置代理
        request.meta['proxy'] = self.proxy

设置代理ip池

posted @   水开白  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示