首页 > 其他分享 >Scrapy框架 之采集某电子网站产品

Scrapy框架 之采集某电子网站产品

时间:2023-01-09 10:22:51浏览次数:39  
标签:name 框架 item url self scrapy 采集 Scrapy page

一、创建项目

第一步:scrapy startproject lianhe

第二步:cd lianhe

    scrapy genspider product  www.lhecn.com.cn

二、示例代码

start.py

from scrapy import cmdline
import os

if __name__ == '__main__':
    dirname = os.path.dirname(os.path.abspath(__file__))
    os.chdir(dirname)
    
    cmdline.execute("scrapy crawl product".split())

items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class LianheItem(scrapy.Item):
    # define the fields for your item here like:
    catname = scrapy.Field()
    name = scrapy.Field()
    pdf = scrapy.Field()
    pics = scrapy.Field()
    pass

product.py

# -*- coding: utf-8 -*-
import scrapy
import requests
from lxml import etree
from ..items import LianheItem

class ProductSpider(scrapy.Spider):
    name = 'product'
    allowed_domains = ['www.lhecn.com.cn']

    host = 'https://www.lhecn.com.cn'

    start_urls = [
        {"name": '线对板连接器', "url": host + '/category/wire-to-board/page/{0}/'},
        {"name": '线对线连接器', "url": host + '/category/wire-to-wire/page/{0}/'},
        {"name": '板对板连接器', "url": host + '/category/pc-board-in/page/{0}/'},
        {"name": '快插端子(110,187,250)', "url": host + '/category/faston-terminal/page/{0}/'},
        {"name": 'FFC&FPC连接器', "url": host + '/category/ffc-fpc-connector/page/{0}/'},
        {"name": '接线端子', "url": host + '/category/terminal-block/page/{0}/'},
    ]

    # 获取总页数
    def get_all_page(self, url):
        response = requests.get(url)
        html = etree.HTML(response.content, parser=etree.HTMLParser())
        res = html.xpath('//div[@class="wp-pagenavi"]')
        if len(res) > 0:
            p = res[0].xpath("./a[last()-1]//text()")[0]
            return int(p)
        return 1

    def start_requests(self):
        for item in self.start_urls:
            # 获取总共有多少页
            url = item.get('url')
            total_page = self.get_all_page(url.format('1'))

            print("total_page = " + str(total_page))

            for page in range(1, total_page+1):
                link = url.format(str(page))
                yield scrapy.Request(link, callback=self.parse, meta={"url": link, "name": item.get('name')})

    def parse(self, response):
        meta = response.meta
        for each in response.xpath('//div[@class="pro-imgs col-md-4 col-sm-6 col-xs-6"]'):
            url = each.xpath("./div[@class='imgallbox imgtitle-h3']//h3//a/@href").extract()[0]
            name = each.xpath("./div[@class='imgallbox imgtitle-h3']//h3//a//text()").extract()[0]
            # print(url)
            # print(name)
            item = LianheItem()
            item['catname'] = meta['name']
            item['name'] = name.strip()

            yield scrapy.Request(url, callback=self.url_parse, meta={"item": item})

    def url_parse(self, response):
        item = response.meta['item']
        item['pdf'] = response.xpath("//div[@class='pdf_uploads']//a/@href").extract()[0]
        pics = []
        for pic in response.xpath("//div[@class='sp-wrap']//a/@href").extract():
            pics.append(pic)
        item['pics'] = pics

        yield item

pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

import os
import requests

class LianhePipeline(object):
    count = 0
    cat_dict = {}

    def __init__(self) -> None:
        pass

    def process_item(self, item, spider):
        self.count += 1

        # 判断分类文件夹是否存在
        if not os.path.exists(item["catname"]):
            os.mkdir(item["catname"])
        
        cat_product_count = self.cat_dict.get(item["catname"])
        if cat_product_count is None:
            count = 1
        else:
            count = int(cat_product_count) + 1
        
        self.cat_dict[item["catname"]] = count

        # 网络pdf保存到本地
        file = item["catname"] + '/' + str(count) + ".pdf"
        self.save_file(item['pdf'], file)
        num = 1
        for pic in item['pics']:
            file = item["catname"] + '/' + str(count) + "_"+str(num)+".jpg"
            self.save_file(pic, file)
            num += 1

        with open( item["catname"] + '/' + str(count) +'.txt','w') as f:
            f.write(item['name'])
            f.close()

        return item
    
    def save_file(self, url, filename):
        if url == '':
            return False

        response = requests.get(url)
        with open(filename,'wb') as f:
            f.write(response.content)
            f.close()

    def close_spider(self, spider):
        print("总共采集:{0}".format(str(self.count)))

 

标签:name,框架,item,url,self,scrapy,采集,Scrapy,page
From: https://www.cnblogs.com/yang-2018/p/17036149.html

相关文章

  • Flask框架及其漏洞学习
    Flask是什么?Flask是一个相对于Django而言轻量级的Web框架,是Python开发的一个基于Werkzeug和Jinja2的web开发微框架,它的优势是极其简洁,但又非常灵活,而且容易学习和应用。......
  • Element前端框架的简介+基于springboot框架的CRUD
    1ElementUI简介基于Vue的一套桌面端组件库,提前封装好的UI模板,方便开发者快速搭建一个网站前端界面。官网:https://element.eleme.cn/2ElementUI安装首先创建......
  • gin框架中结合cron实现定时任务执行
    gin框架中结合cron实现定时任务执行背景:一个hr管理系统中,需要每日定时处理员工离职操作,需要每天定时执行删除账号等操作,在这使用定时任务比较方便,比如每天晚21点执行实现......
  • Java Netty框架自建DNS代理服务器教程
    前言DNS协议作为着互联网客户端-服务器通信模式得第一关,在当下每天都有成千上亿上网记录产生得当今社会,其重要性自然不可言喻。在国内比较有名得DNS服务器有电信得114.11......
  • Fission:基于 Kubernetes 的 Serverless 函数框架
    原文为Platform9的软件工程师SoamVasani所写,讲解了一个基于Kubernetes的Serverless函数(FaaS)框架——Fission。简单的来讲,Fission是一个构建在 ​​Kubernetes​......
  • SpringBoot笔记--文件配置加载顺序+整合其他框架
    内部文件配置加载顺序外部文件配置加载顺序jar包配置整合Junit若是业务管理类和测试类在同一个包下面,那么这句话,可以不加括号,只写注解名称否则,就必须指定到包......
  • cocos creator教程:框架 - 封装
    【muzzik教程】:框架-封装遇到的问题部分接口/属性不想暴露给外部外部引用方式框架加载方式部分接口/属性不想暴露给外部exportclassprivate_test{ test_b=......
  • 微服务系列 1:服务化框架落地的挑战和核心需求
    一、微服务架构概览1-1、微服务出现的意义所在微服务出现的意义在哪里呢?它的优势有哪些呢?如何保障业务演进但是系统架构还是依然往好的方向发展呢?一般而言,随着公司产品线的......
  • 客服系统即时通讯IM开发(二)Golang + Gin框架实现服务端WebScoket【唯一客服】网站在线
    我的客服系统使用的Golang+Gin作为后端服务,所以下面的代码是演示demo在Go语言中使用Gin框架实现WebSocket的方法如下:安装gin-gonic/websocket库。在Gin......
  • Pytorch图像分类训练框架
    Pytorch图像分类训练框架使用pytorch进行图像分类训练是一个大部分代码可复用的过程,我将在kaggle比赛PaddyDoctor中写的训练代码抽取出来,方便以后图像分类任务使用。代......