问题
在爬取一个网站的时候,爬取数据时爬取到一堆重复的数据,而使用resquest模块却不会有重复的数据出现
原因
- request模块是一个单线程的模块
- scrapy 是一个异步的爬虫框架,在爬虫程序中在一个大分类中创建的字典,在yeild传值的时候,传递的是字典的引用,而经过多个for 循环,会将里面的值更改掉,然后直接保存,从而出现很多数据是重复的现象
- 直接传值(传递的是引用),会使后面的数据影响前一次使用的数据
解决这个问题的方法
- 使用深拷贝,在使用yeild传值的时候传递真正的值,而不传递其引用
- 及使用copy模块deepcopy
我自己做实例的时候出现错误的程序
import scrapy
from f003books.items import F003BooksItem
from pprint import pprint
class BooksSpider(scrapy.Spider):
name = 'books'
allowed_domains = ['book.kongfz.com']
start_urls = ['http://book.kongfz.com/Cxianzhuang/']
def parse(self, response):
"""1. 分组,获取分类"""
family_list = response.xpath(
"//div[@class='filter-item p-b15']/a[@class='three-level-polymerization']")
# items = {}
for family in family_list:
items = F003BooksItem()
items["family"] = family.xpath("./span[1]/text()").extract_first()
items["family_url"] = family.xpath("./@href").extract_first()
yield scrapy.Request(
items["family_url"],
meta={
"items": items},
callback=self.books_parse
)
def books_parse(self, response):
""" 2. 获取图书页的信息"""
# 图书分组
items = deepcopy(response.meta