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
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.
L'essentiel ici estheader, vous êtes le type
J'ai encore besoin de quelques conseils pour vous iciset
类型,我修改后是dict
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
Parce que certains noms de colonnes spécifiés dans les champs n'existent pas dans l'élément