最近在写代码的时候经常报错,能力有限,再此只提供解决办法,如有错误请及时纠正
1:scrapy做post提交data键值都是字符串,如有汉字或数值类型先转字符串
yield scrapy.FormRequest(url=start_url,headers=headers,method = 'POST',formdata=data,callback=self.parse,dont_filter=True)
同时dont_filtter,要慎重考虑是否开启,因为他是true为scrapy不过滤URL
2:xpath不能使用想获取所有文本这种索引写法。解决方案:
data = selector.xpath('//div[@id="test3"]')
info = data.xpath('string(.)').extract()[0]
当然提取文本只是一种方法,再有文章将会详细写下scrapy的selector选择器
这里还有个xpath选择层级想说说
(//node)[1]#选择当前所有节点中的第一个 xp("(//ul/li)[1]")
//node[1]从父节点向上截取该节点中出现的第一个(可以匹配出多个父节点下的第一个为node的节点)xp("//ul/li[1]")
3extract()出来是一个列表extract_first(“”)出来是字符串默认值
列表加到字符串中”“.join(),,当然你想切割原字符串加点佐料也是可以的:
"_".join(str.split(""))#split切割之后是一个列表,可以将"_"作为str每个元素的间隔,当然replace()和正则的sub()亦可实现
4:有些文章在提取字段是会有间隔符和一些特殊字符在写入数据库是报错需提前替换
replace(' ','')
.extract_first("").replace(u'\u3000',u'')##\u3000(\u3000 是全角的空白符)
##含有 \xa0 (\xa0 是不间断空白符 )也是类似的方法
当然还有笑脸符号也是会报错的,请自行百度脑补
5#使用此包有时会报错可修改:fake_useragent.UserAgent(use_cache_server=False)#window要加linux去掉
6:代码优化的好思路,一般提取不同字段都是分开,但是此处是个好思路
links = response.xpath('//a[contains(@href, "image")]').extract()
for index, link in enumerate(links): ###枚举的是带有索引的所以后面再提取就会方便
args =(index,link.xpath('@href').extract(),link.xpath('img/@src').extract())`
7那么在我们程序当中有时在减少代码冗余,会将相同的代码段给个状态码来触发,如果状态码没有回归原始位,会使你的状态一直停留在最后一个状态,ps:就像循环中不break一样
state=1 ####这种状况下很容易在运行一次满足条件state永久变为3
for i in 。。。:
if ..:
elif..:
state=3
else..:
state=3
if state==3:
那么此时一定要在if state==3:后面的代码段中写入state=1.。。当然你可能有其他需求
好了最近比忙平时也忘记了记录踩过的坑有时间再写吧