pythonScarpy框架项目实战

爬虫实战

*
创建项目
项目需求
分析网站
爬虫文件spiders
items.py
pipelines.py
settings.py
总结:

创建项目

在终端输入 scrapy startproject xiaomai
进入到项目实例下 cd xiaomai
创建爬虫文件夹
scrapy genspider xiaomai_pro www.xxx.com

项目需求

目标网站:https://www.chinaseed114.com/

目的需求 获取所有小麦种子的信息

https://www.chinaseed114.com/seed/xiaomai/

分析网站

确认爬取的数据,解析数据要用的解析方式
查看网页和源代码的区别(防止后面解析网页的时候出错)

爬虫文件spiders

主要实现的功能

  • 获取所有小麦种子的url
  • 获取小麦种子的所有数据
  • 数据清洗和分类

在分析网页的时候,发现网页是静态网页,网页之间的格式不统一,对于数据的分类带来很大的困难

pythonScarpy框架项目实战
pythonScarpy框架项目实战

在进行数据分类的时候根据一些常出现的词语作为切入点,利用字符串的切片来进行分割数据,
然后再将分割出来的数据进行处理,删除一些于数据无关的文字

import math
import time
import random
import scrapy
from xiaomai.items import XiaomaiItem

class XiaomaiProSpider(scrapy.Spider):
    name = 'xiaomai_pro'

    start_urls = ['https://www.chinaseed114.com/seed/pzdq/']

    def parse(self, response):

        xiaomai_url = response.xpath('/html/body/div[5]/div[3]/div[2]/table/tr[1]/td[2]/a/@href').extract_first()
        name = response.xpath('/html/body/div[5]/div[3]/div[2]/table/tr[1]/td[2]/a/text()').extract_first()
        num = response.xpath('/html/body/div[5]/div[3]/div[2]/table/tr[1]/td[2]/span/text()').extract_first()
        num = math.ceil(int(num[1:-1])/80)

        print(name+xiaomai_url)
        for i in range(1,num+1):
            print(xiaomai_url+f"{i}.html")
            time.sleep(random.random())
            yield scrapy.Request(url=xiaomai_url+f"{i}.html", callback=self.parse_pinzhong)

    def parse_pinzhong(self, response):
"""
        获取每一页中每一个种子的url
        :param response:每一页的网址的对象
        :return:
"""
        items_url = []
        tr = response.xpath('/html/body/div[5]/div[1]/div/div[4]/table[2]/tr')

        for i in range(len(tr)):

            items_url.extend(tr[i].xpath('./td/ul/li/a/@href').extract())

        for item_url in items_url:
            time.sleep(random.random())
            yield scrapy.Request(url=item_url, callback=self.parse_item_data)

    def parse_item_data(self,response):
"""
        提取具体得信息
        :param response:
        :return:
"""

        text_list = response.xpath('//*[@id="article"]//text()').extract()

        s = ['\r', '\n', '\xa0', ',']
        text_list2 = []
        for i in text_list:
            for j in s:
                i = i.strip().replace(j, '')
            text_list2.append(i)

        text = ','.join(text_list2)
        text = text.replace(',','')
        label = ['审定编号', '品种名称','申 请 者', '申请人','申请者','申请单位', '申报单位','育种人','育 种 者','育种者', '选育单位','品种来源',
                 '特征特性', '品质分析结果', '抗性鉴定结果','引 种 者',
                 '产量表现', '栽培技术要点', '审定意见', '抗性鉴定', '亲本组合','品质分析', '适宜地区', '抗病鉴定', '产量结果','引种备案号']

        label_dict = dict(zip(label, ['' for i in range(len(label))]))
        for i in label:
            target = ''
            if i in text:
                start_num = text.find(i)
                if start_num != -1:
                    start_num += len(i) + 1
                end_num = text[start_num:].find(':')
                if end_num != -1:
                    end_num = end_num + start_num

                target = text[start_num:end_num]

                for j in label:
                    if j in target:
                        target = target.replace(j, '')
                        break
            label_dict[i] = target
        if '适宜' in label_dict['审定意见']:
            ind = label_dict['审定意见'].find('适宜')
            label_dict['审定意见'] = label_dict['审定意见'][ind:]

        if label_dict['育种者'] == '':
            if label_dict['选育单位'] != '':
                label_dict['育种者'] = label_dict['选育单位']
            elif label_dict['育 种 者']!= '':
                label_dict['育种者'] = label_dict['育 种 者']
            elif label_dict['育种人'] != '':
                label_dict['育种者'] =  label_dict['育种人']

        if label_dict['申请者'] == '':
            if label_dict['申 请 者'] !='':

                label_dict['申请者'] = label_dict['申 请 者']
            elif label_dict['申请单位'] !='':
                label_dict['申请者'] = label_dict['申请单位']
            elif label_dict['申请人'] !='':
                label_dict['申请者'] = label_dict['申请人']
            elif label_dict['申报单位'] !='':
                label_dict['申请者'] = label_dict['申报单位']
        nams = ['号','二',':','作物名称','育种单位','引种备案号','主要性状',')试验名称','〈1〉品种来源','引 种 者','作物名称']
        for i in nams:
            if i in label_dict['审定编号']:
                ind = label_dict['审定编号'].find(i)
                label_dict['审定编号'] = label_dict['审定编号'][:ind]

        item = XiaomaiItem()
        item['serial_number'] = label_dict.get('审定编号')
        item['url'] = response.url
        item['name'] = label_dict.get("品种名称")
        item['applicant'] = label_dict.get('申请者')
        item['breeder'] = label_dict.get('育种者')
        item['source'] = label_dict.get('品种来源')
        item['basics_data'] = label_dict.get('特征特性')
        item['output_data'] = label_dict.get('产量表现')
        item['plant_method'] = label_dict.get('栽培技术要点')
        item['area'] = label_dict.get('审定意见')
        yield item

items.py

建立item类

class XiaomaiItem(scrapy.Item):
    serial_number = scrapy.Field()
    name = scrapy.Field()
    url = scrapy.Field()
    applicant = scrapy.Field()
    breeder = scrapy.Field()
    source = scrapy.Field()
    basics_data = scrapy.Field()
    output_data = scrapy.Field()
    plant_method = scrapy.Field()
    area = scrapy.Field()

pipelines.py

持久化储存
文件格式为.csv

import pandas as pd

class XiaomaiPipeline:
    def open_spider(self, spider):
        print('开始爬虫')

    def process_item(self, item, spider):
        df = [item['serial_number'],
        item['name'],
        item['url'],
        item['applicant'],
        item['breeder'],
        item['source'],
        item['basics_data'],
        item['output_data'],
        item['plant_method'],
        item['area']]
        df = pd.DataFrame(df).T
        df.to_csv('./xiaomai_data.csv',mode='a',index=False,header=False,encoding='utf-8',chunksize=True)
        print("追加成功")
        return item
    def close_spider(self, spider):
        print("爬虫结束")

settings.py

项目的相关配置

USER_AGENT = '' UA 伪装

ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'

DOWNLOADER_MIDDLEWARES = {
   'xiaomai.middlewares.XiaomaiDownloaderMiddleware': 543,
}

ITEM_PIPELINES = {
   'xiaomai.pipelines.XiaomaiPipeline': 300,
}

总结:

  • 在使用xpath解析的时候遇到了通过检查得到的代码和源代码不一样的情况
  • 项目还不是很完善,因为所爬网站的信息格式不统一,所以在进行数据清洗和数据分类的时候,并不能将所有的数据进行合理的分配。
  • 爬虫的伪装性太差,只有ua伪装,改变访问的频率,没有进行ip伪装
  • 在数据存储的方面,每存储一个小麦种子的信息,就需要操作一遍文件,效率有点低

Original: https://blog.csdn.net/qq_52007481/article/details/124480329
Author: 小鱼干儿♛
Title: pythonScarpy框架项目实战

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/698267/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据分析思维

    在工作中当我们遇到难题时,首先我们需要知道,比如问题诊断、识别机会,规避风险等。这是WHY。 那分析什么?比如战略分析,用户偏好分析,STP分析,品牌建设分析,营销组合分析,客户画…

    人工智能 2023年6月11日
    065
  • 数据处理可视化的最有价值的 50 张图 (上)

    数据处理可视化的最有价值的 50 张图 数据处理可视化的最有价值的 50 张图 (上) 数据处理可视化的最有价值的 50 张图 (下) 文章目录 数据处理可视化的最有价值的 50 …

    人工智能 2023年6月11日
    072
  • 一文弄懂Python中的 if __name__ == __main__

    引言 在Python相关代码中,我们经常会遇到如下代码段: stuff if __name__ == "__main__": # do stuff 本文将尽可能…

    人工智能 2023年7月3日
    046
  • 转转前端周刊第五期

    本刊意在整理业界精华文章给大家,期望大家一起打开视野 浏览器提供了 5 种 Observer 来监听这些变动:MutationObserver、IntersectionObserv…

    人工智能 2023年7月17日
    071
  • 用树莓派做一个语音机器人

    早就想写一篇语音机器人的文章,凑巧这两天受委托做个树莓派语音机器人,又复习一下流程熟悉了过程才准备写一篇文章,这是基于图灵机器人和百度api的语音助手。 目录 准备 * 硬件准备 …

    人工智能 2023年5月25日
    067
  • 2022-2028年中国化学药行业市场研究及前瞻分析报告

    【报告类型】产业研究 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了化学药行业相关概述、中国化学药行业运行环境、分析…

    人工智能 2023年7月18日
    077
  • C++基础10:并行加速与OpenCV数据结构

    目录 一.程序加速 1.编程基本原则 2.代码优化策略 3.SIMD 4.openMP 二.避免内存拷贝(OpenCV) 1.什么是图像 2.Mat 3.Step 4.ROI 一….

    人工智能 2023年7月20日
    050
  • 随机森林模型

    本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合…

    人工智能 2023年6月15日
    095
  • Pandas基础题一百道(16~20)

    目录 16、打印DataFrame的前后数据行 ①:打印DataFrame ​ ②:打印DataFrame前10行数据 ③:打印DataFrame后十行数据 17、查看DataFr…

    人工智能 2023年7月6日
    096
  • 安装pytorch深度学习环境(GPU版)和pycharm

    1.安装或更新显卡驱动 根据自己的电脑的配置和需求,安装或更新显卡驱动,nvidia显卡驱动下载地址:官方驱动 | NVIDIA 下载可能比较慢,有梯子的话会好些。下载完成后安装e…

    人工智能 2023年7月21日
    054
  • 文本摘要 ACL2021

    参考链接: 研究背景: 临床概要。 本文的工作: CLUSTER2SENT算法: ①提取摘要部分重要句子; ②聚合相关的句子; ③生成一个总结的句子。 生成更真实的、连贯的句子; …

    人工智能 2023年5月27日
    063
  • 4.多元线性回归

    线性模型假定预测(\hat{y})是对应(x={x_1,x_2,\cdots,x_p})的属性的线性组合,即: [\begin{align} \hat{y} &=\thet…

    人工智能 2023年6月4日
    076
  • of介词短语作定语_介词短语做什么成分

    介词短语做什么成分2020-05-23 14:30:35文/董玉莹 介词短语在句子中充当表语、状语、定语和补语。常用介词短语有:at once立刻;at last最后;at fir…

    人工智能 2023年6月10日
    079
  • 寻找两个点云重叠部分

    目录 * – 方法1: – 方法1实验效果: – 方法2(c++): – 方法2(python) – 方法2实验效果: …

    人工智能 2023年6月2日
    084
  • 【线性回归】for循环求简单线性回归的误差函数

    导览全文 了解数据集 目标简述 主体代码展示 01、了解数据集 data.csv:一个保存着若干数据点坐标的文件。 首先导入相关依赖,通过散点图的形式画出数据 导入数据库 impo…

    人工智能 2023年6月17日
    052
  • R-CNN,SSD,YOLO算法简单对比

    文章目录 * – 1.R-CNN – + 1.1 R-CNN + 1.2 Fast R-CNN + 1.3 Faster R-CNN + 1.4 Mask …

    人工智能 2023年7月9日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球