Nachdem der Crawler das Diktat generiert hatte, wollte ich es in eine CSV-Datei schreiben, aber es ist ein Fehler aufgetreten.
Verwenden Sie ein Jupyter-Notebook und eine Windows-Umgebung.
Der spezifische Code lautet wie folgt
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()
Führen Sie den obigen Code aus und die Fehlermeldung lautet
ValueError: Zu viele Werte zum Entpacken (erwartet 2)
Der Grund für die Abfrage ist, dass zum Durchlaufen von dict die Form von dict.items() erforderlich ist. Aber wie man es im obigen Code implementiert, ist noch nicht geklärt. Bitte geben Sie mir einen Rat
不好意思哈,现在才有时间来回答你的问题,看到你根据我的建议把代码改过来了,下面我把改过的代码贴出来,我运行过,是没问题的
这里主要是header,你原来是
set
类型,我修改后是dict
类型这里还需要给你一些建议
你的代码是放到ide还是文本编辑器中运行的?有的东西在ide下明显会报错啊
建议新手从开始学的时候就遵守PEP8规范,别养成了坏习惯,你看看你的命名
我这样写并没报错喔
writerow就是直接接收dict的吧,你这个问题,我感觉是因为item的key与你表头不对应
因为在 fields 中指定的某些列名在 item 中不存在