这是因为tbody是Firefox和Chrome等浏览器自动添加的标记。
但是当使用Scrapy进行抓取时,tbody不在responseHTML中。
所以我们只要把xpath里的tbody删除即可正常爬取的数据
顺便写点scrapy的经验吧, 进入循环的xpath语句记得前面没有/这些东西, 直接按节点走,例如:第一个for循环是对末尾的div数组进行遍历, 然后第二层循环是对div数组里的div[2]/div/div[]数组进行遍历, 注意xpath格式。
for l in response.xpath('/html/body/div[4]/div/div'):
for x in l.xpath('div[2]/div/div'):
xpth可以通过F12->复制->复制xpath很方便的得到。
这里spider虽然没用到但是参数必须加上否则会报错
保存数据为save.json格式的pipeline
class Test1Pipeline:
def __init__(self):
self.file = codecs.open('save.json', 'w+', encoding='utf-8')
def open_spider(self, spider):
self.file.write('[n')
def process_item(self, item, spider):
# # 读取item中的数据
# line = json.dumps(item, ensure_ascii=False) + 'n'
line = json.dumps(dict(item), ensure_ascii=False)
self.file.write('t' + line + ',n')
return item
def close_spider(self, spider):
#定位到最后一个多余的逗号
self.file.seek(-2, os.SEEK_END)
#删除逗号及后面的东西
self.file.truncate()
#加上换行和]
self.file.write('n]')
#关闭
self.file.close()
注意json只能有一对{}, 多个{}可以放入list保存
可以通过设置具体响应头, 模拟登录, 使用池设置爬取间隔等方式来避免反爬



