scrapy爬虫注意事项
- item数据只有最后一条
- item字段传递后错误,混乱
- 对一个页面要进行两种或多种不同的解析
- xpath中contains的使用
- 提取不在标签内的文本内容
- 使用css、xpath提取倒数第n个标签
- 提取表格信息(含合并单元格)
- 模拟登陆
一、item数据只有最后一条
这种情况一般存在于对标签进行遍历时,将item对象放置在了for循环的外部。解决方式:将item放置在for循环里面。
def parse(self,response):
#item = ExampleItem() # 存在for循环时,item不要放置在这里
for result in result_list:
item = ExampleItem() # 放置在for循环里面
item['name'] = result.css('div a::text').extract_first()
item['age'] = result.css('div #id').extract_first()
yield item
二、item字段传递后错误,混乱
有时候会遇到这样的情况,item传递几次之后,发现不同页面的数据被混乱的组合在了一起。这种情况一般存在于item的传递过程中,没有使用深拷贝。解决方式:使用深拷贝来传递item。
import copy
def parse_base(self,response):
base_url = 'https://www.base_url.com'
for result in result_list:
item = ExampleItem()
item['name'] = result.css('div a::text').extract_first()
item['age'] = result.css('div #id').extract_first()
yield scrapy.Request(url=base_url,meta=copy.deepcopy({
'item':item}),callback=self.parse_detail) # 使用深拷贝将item存在meta中
def parse_detail(self,response):
item = response.meta['item'] # 取出之前传递的item
"""
do some thing
"""
yield item
三、对一个页面要进行两种或多种不同的解析
这种情况一般出现在对同一页面有不同的解析要求时,但默认情况下只能得到第一个parse的结果。产生这个结果的原因是scrapy默认对拥有相同的url,相同的body以及相同的请求方法视为一个请求。解决方式:设置参数dont_filter=‘True’。
def