9回答

1收藏

论个人代码风格的优缺点,欢迎讨论、嘲讽、羡慕和抨击!!!!

问答交流 问答交流 3596 人阅读 | 9 人回复 | 2020-04-30

# -*- coding: utf-8 -*-
"""
=========================================
@File: 111.py
@Author: 鸢公子
@E-mail: [email protected]
@Time: 四月 30, 2020
@Desc:
=========================================
"""
import json
import scrapy
from scrapy import Request
class ZqTzSpider(scrapy.Spider):
    name = '某网'
    uu = '部分网址'
    def parse(self, response):
        row = json.loads(response.text)
        [item.setdefault('pop', 'amac_code') for item in row['content']]
        yield from row['content']
        yield from [Request(self.uu % item['url'], self.parse_item, meta={'id': item['id']}) for item in row['content']]
    @staticmethod
    def item_up(d1: dict, d2: dict):
        d1.update(d2)
        return d1
    def parse_item(self, response):
        """机构信息, 异常信息, 出资人信息"""
        items = list()
        """机构信息"""
        items.append(self.item_up(
            {'pid': response.meta['id'], 'pop': '机构信息表', 'from_url': response.url,
             '更新': response.xpath('//tr[td[text()="特别提示信息"]]/td[2]/text()').get(''),
             '提示': response.xpath('//tr[td[text()="特别提示信息"]]/td[4]/text()').get('').strip()},
            {''.join([i.strip() for i in tr.xpath('./td[@class="title"]//text()').getall()]): ''.join(
                set([i.strip() for i in tr.xpath('./td[not(@class="title")]//text()').getall()])).replace('投诉', '')
             for tr in response.xpath('//div[div/span[text()="机构信息"]]//tr')}))
        """异常信息"""
        [items.append({
            'pid': response.meta['id'],
            'pop': '异常信息表',  # 异常信息表
            'from_url': response.url,
            '异常': tr.xpath('./td[1]/text()').get(),
            '事件': ''.join([i.strip() for i in tr.xpath('./td[2]//text()').getall()])
        }) for tr in response.xpath('//tr[td[text()="机构诚信信息"]]//tbody/tr')]
        """出资人信息"""
        [items.append({
            'pid': response.meta['id'],
            'pop': 'amac_chu_zi',  # 出资人信息表
            'from_url': response.url,
            '姓名/名称': tr.xpath('./td[2]/text()').get(''),
            '持股比例': tr.xpath('./td[3]/text()').get('')
        }) for tr in response.xpath('//div[span[text()="出资人信息"]]/following-sibling::div//tbody//tbody/tr')]
        yield from items
分享到:
回复

使用道具 举报

回答|共 9 个

不坐牢就继续爬

发表于 2020-4-30 15:50:04 | 显示全部楼层

挺好的,没毛病
回复

使用道具 举报

loco

发表于 2020-4-30 16:56:07 | 显示全部楼层

没啥问题。pycharm的代码格式化功能可以多用用。
回复

使用道具 举报

花儿谢了

发表于 2020-4-30 23:41:17 | 显示全部楼层

感觉就是缺点空行
回复

使用道具 举报

鸢公子

发表于 2020-5-12 09:10:15 | 显示全部楼层

空行其实不少,因为这里复制代码和Pycharm中的一行字符长度不一样,发完贴就感觉不美观
回复

使用道具 举报

鸢公子

发表于 2020-5-13 17:13:39 | 显示全部楼层

回复

使用道具 举报

energy

发表于 2020-5-13 17:22:16 | 显示全部楼层

scrapy 传参的话meta 最好用深拷贝,以防数据错乱
回复

使用道具 举报

鸢公子

发表于 2020-5-13 17:45:53 | 显示全部楼层

经过测试,如果变量名相同,有可能出现数据错乱,产生原因是多线程共享变量,定义的变量后,同时提取数据是会出现存错变量里的,如 item = response.meta['item'] 最好使用深拷贝,
本公子方式主要使用内存地址传递,目前为止没有产生数据错乱的情况,
分析发现与变量的作用域有关,变量的值是另一个变量的部分值时,多线程会出现变量引用错误,但基础定于变量不会,例如:实例化,item = dict(),items = list(),本公子认为主要取决于是否主动开辟空间存储。
如有不对,还望指出!
回复

使用道具 举报

nolhc

发表于 2020-5-15 18:11:41 | 显示全部楼层

还可以
回复

使用道具 举报

鸢公子

发表于 2020-6-2 12:44:38 | 显示全部楼层

[抱拳]
回复

使用道具 举报