Maison  >  Questions et réponses  >  le corps du texte

Un novice aimerait demander des conseils sur comment écrire une boucle dict dans un fichier csv en python3 (problèmes rencontrés lors du crawl) ?

Après que le robot ait généré le dict, j'ai voulu l'écrire dans un fichier csv, mais une erreur s'est produite
Utilisez le notebook Jupyter et l'environnement de fenêtre.

Le code spécifique est le suivant

import requests

from multiprocessing.dummy import Pool as ThreadPool

from lxml import etree

import sys

import time

import random

import csv


def spider(url):

    header={

        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'

    }

    timeout=random.choice(range(31,50))

    html = requests.get(url,header,timeout=timeout)

    time.sleep(random.choice(range(8,16)))

    selector = etree.HTML(html.text)

    content_field = selector.xpath('//*[@class="inner"]/p[3]/p[2]/ul/li')

    item ={}

    for each in content_field:

        g = each.xpath('a/p[1]/p[1]/h3/span/text()')

        go = each.xpath('a/p[1]/p[2]/p/h3/text()')

        h = each.xpath('a/p[1]/p[2]/p/p/text()[1]')

        j= each.xpath('a/p[1]/p[1]/p/text()[2]')

        ge = each.xpath('a/p[1]/p[2]/p/p/text()[3]')

        x = each.xpath('a/p[1]/p[1]/p/text()[3]')

        city = each.xpath('a/p[1]/p[1]/p/text()[1]')

        gg = each.xpath('a/p[2]/span/text()')

        item['city']="".join(city)

        item['hangye']="".join(hangye)

        item['guimo']="".join(guimo)

        item['gongsi']="".join(gongsi)

        item['gongzi']="".join(gongzi)

        item['jingyan']="".join(jingyan)

        item['xueli']="".join(xueli)

        item['gongzuoneirong']="".join(gongzuoneirong)

        fieldnames =['city','hangye','guimo','gongsi','gongzi','jingyan','xueli','gongzuoneirong']

        with open('bj.csv','a',newline='',errors='ignore')as f:

            f_csv=csv.DictWriter(f,fieldnames=fieldnames)

            f_csv.writeheader()

            f_csv.writerow(item)


if __name__ == '__main__':
    pool = ThreadPool(4)
    f=open('bj.csv','w')
    page = []
    for i in range(1,100):
        newpage = 'https://www.zhipin.com/c101010100/h_101010100/?query=%E6%95%B0%E6%8D%AE%E8%BF%90%E8%90%A5&page='+str(i) + '&ka=page-' + str(i)
        page.append(newpage)
        
    results = pool.map(spider,page)
    pool.close()
    pool.join()
    f.close()

Exécutez le code ci-dessus et le message d'erreur est

ValueError : trop de valeurs à décompresser (2 attendues)
La raison de l'interrogation est que pour parcourir dict, la forme dict.items() est requise. Mais comment l'implémenter dans le code ci-dessus n'a pas été réglé. Veuillez me donner quelques conseils

.
我想大声告诉你我想大声告诉你2732 Il y a quelques jours1417

répondre à tous(3)je répondrai

  • 習慣沉默

    習慣沉默2017-05-18 10:51:20

    Désolé, je n'ai que le temps de répondre à votre question maintenant. J'ai vu que vous avez modifié le code selon ma suggestion. Je publierai le code modifié ci-dessous. Je l'ai exécuté et il n'y a pas de problème.

    import requests
    from multiprocessing.dummy import Pool
    from lxml import etree
    import time
    import random
    import csv
    
    
    def spider(url):
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
        }
    
        timeout = random.choice(range(31, 50))
        html = requests.get(url, headers=header, timeout=timeout)
    
        time.sleep(random.choice(range(8, 16)))
    
        selector = etree.HTML(html.text)
    
        content_field = selector.xpath('//*[@class="inner"]/p[3]/p[2]/ul/li')
    
        item = {}
    
        for each in content_field:
            g = each.xpath('a/p[1]/p[1]/h3/span/text()')
    
            go = each.xpath('a/p[1]/p[2]/p/h3/text()')
    
            h = each.xpath('a/p[1]/p[2]/p/p/text()[1]')
    
            j = each.xpath('a/p[1]/p[1]/p/text()[2]')
    
            ge = each.xpath('a/p[1]/p[2]/p/p/text()[3]')
    
            x = each.xpath('a/p[1]/p[1]/p/text()[3]')
    
            city = each.xpath('a/p[1]/p[1]/p/text()[1]')
    
            gg = each.xpath('a/p[2]/span/text()')
    
            item['city'] = "".join(city)
    
            item['hangye'] = "".join(g)
    
            item['guimo'] = "".join(go)
    
            item['gongsi'] = "".join(h)
    
            item['gongzi'] = "".join(j)
    
            item['jingyan'] = "".join(ge)
    
            item['xueli'] = "".join(x)
    
            item['gongzuoneirong'] = "".join(gg)
    
            fieldnames = ['city', 'hangye', 'guimo', 'gongsi', 'gongzi', 'jingyan', 'xueli', 'gongzuoneirong']
    
            with open('bj.csv', 'a', newline='', errors='ignore')as f:
                f_csv = csv.DictWriter(f, fieldnames=fieldnames)
    
                f_csv.writeheader()
    
                f_csv.writerow(item)
    
    
    if __name__ == '__main__':
        f = open('bj.csv', 'w')
        page = []
        for i in range(1, 100):
            newpage = 'https://www.zhipin.com/c101010100/h_101010100/?query=%E6%95%B0%E6%8D%AE%E8%BF%90%E8%90%A5&page=' + str(
                i) + '&ka=page-' + str(i)
            page.append(newpage)
        print(page)
        pool = Pool(4)
        results = pool.map(spider, page)
        pool.close()
        pool.join()
        f.close()
    

    L'essentiel ici est

    header, vous êtes le typeset类型,我修改后是dict

    J'ai encore besoin de quelques conseils pour vous ici

    1. Exécutez-vous votre code dans un IDE ou un éditeur de texte ? Certaines choses signaleront évidemment des erreurs sous l'IDE

    2. Il est recommandé aux novices de respecter les spécifications PEP8 dès le début de l'apprentissage. Ne développez pas de mauvaises habitudes. Jetez un œil à votre dénomination

      .
    3. répondre
      0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-18 10:51:20

    item = {'a':1, 'b':2}
    fieldnames = ['a', 'b']
    
    with open('test.csv', 'a') as f:
        f_csv = DictWriter(f, fieldnames=fieldnames)
        f_csv.writeheader()
        f_csv.writerow(item)

    Je n'ai pas eu d'erreur lorsque j'ai écrit comme ça

    Writerrow reçoit juste le dict directement. Je pense que votre problème est dû au fait que la clé de l'élément ne correspond pas à l'en-tête de votre table

    répondre
    0
  • 漂亮男人

    漂亮男人2017-05-18 10:51:20

    Parce que certains noms de colonnes spécifiés dans les champs n'existent pas dans l'élément

    répondre
    0
  • Annulerrépondre