pycharm的scrapy包爬虫时重复获取同一条数据

请问这种问题该怎么解决啊?

pycharm的scrapy包爬虫时重复获取同一条数据,
用yield传输之后
csv文件里除了第一行为列名以外,所有行的内容都是一样的,重复该网页目标区的某一条消息(多次运行生成的不同),比该网页目标区的此条信息总量还多

运行语句为:

scrapy crawl eshouse -o eshouse.csv

以下为我的主代码与补充代码

import scrapy
from scrapy import Selector,Request
from zhihuSpider.items import eshouseItem 
 #Item的class放在下一个代码块


class EshousespiderSpider(scrapy.Spider):
    name = "eshouse"
    allowed_domains = ["cd.esf.fang.com"]
    start_urls = ["https://cd.esf.fang.com/"]

    def parse(self, response):
        sel=Selector(response)
        list_items=sel.css('body > div.main1200.clearfix > div.main945.floatl > div.shop_list.shop_list_4 > dl')
        for list_item in list_items:
            item=eshouseItem()
            a=sel.css('dl > dd:nth-child(2) > h4 > a > span::text').extract_first()
            item['title']=a.replace('\n\t\t\t\t\t\t\t\t\t\t\t\t','')
            item['price']=sel.css('dl > dd.price_right > span.red > b::text').extract_first()
            item['priceper']=sel.css('dl > dd.price_right > span:nth-child(2)::text').extract_first()
            item['jiegou']=sel.css('dl > dd:nth-child(2) > p.tel_shop >a::text').extract_first()
            item['transfer'] = sel.css('dl > dd:nth-child(2) > p.clearfix.label > span::text').extract_first()
            item['positive'] = sel.css('dl > dd:nth-child(2) > p.clearfix.label > span::text').extract_first()
            item["url"] = list_item.css("dl > dd:nth-child(2) > h4 > a::attr(href)").extract_first()
            print('\n\n\n\n\n\n\n\n\n\n',item['title'])
            yield item


class eshouseItem(scrapy.Item):
    title=scrapy.Field()
    price=scrapy.Field()
    priceper=scrapy.Field()
    jiegou=scrapy.Field()
    transfer=scrapy.Field()
    positive=scrapy.Field()
    url=scrapy.Field()

```

在使用Scrapy框架进行爬虫时,重复获取同一条数据通常是由于爬虫逻辑或配置问题引起的。以下是一些可能导致重复获取数据的常见原因和解决方法:

  • 爬虫逻辑问题:检查您的爬虫代码,确保您的爬虫逻辑正确处理了重复数据的情况。您可以使用yield语句返回爬取的数据,并在parse方法中使用Request对象设置回调函数来处理下一页的请求。
  • 去重过滤器配置:Scrapy提供了去重过滤器来防止重复爬取相同的URL。确保您正确配置了去重过滤器,以避免重复获取相同的数据。在settings.py文件中,确保以下配置项正确设置:
DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter'
  • 数据库或存储方式问题:如果您将爬取的数据存储到数据库或其他存储方式中,确保您的存储逻辑正确处理了重复数据的情况。您可以在存储之前检查数据是否已存在,并根据需要进行更新或忽略。
  • 请求参数问题:如果您的请求参数不正确或不完整,可能会导致重复获取相同的数据。确保您的请求参数正确设置,并且每个请求都具有唯一的标识符,以便服务器正确响应。
  • 日志调试:使用Scrapy的日志功能进行调试,查看爬虫运行时的日志输出,以确定重复获取数据的具体原因。您可以在settings.py文件中设置日志级别,以便更详细地查看日志信息。

通过检查上述问题,并根据具体情况进行调试和修改,您应该能够解决重复获取同一条数据的问题。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我可以提供一些可能的解决方法,尽可能详细地说明,但是由于没有实际代码,可能无法找出具体问题所在。这是一个可能的解决方案:

    1. 检查item是否正确传递:首先,请确保你正确地使用了item并使用yield将item传递给pipeline。可以添加print语句在item中输出信息,确保得到的是正确的数据。例如:
    def parse(self, response):
        item = MyItem()
        # 填充item的字段信息
        print(item)  # 用于检查item是否包含正确的信息
        yield item
    
    1. 检查item是否正确处理:确认pipeline正确处理了传递的item。可以在pipeline中添加print语句来检查接收到的item的内容。例如:
    class MyPipeline(object):
        def process_item(self, item, spider):
            print(item)  # 用于检查接收到的item内容是否正确
            # 其他处理逻辑
            return item
    
    1. 检查网页结构和选择器使用:确保你正确地选择了目标区域,并使用正确的选择器解析数据。可以使用浏览器的开发者工具来检查目标区域的HTML结构,并尝试在命令行中使用Scrapy自带的Selector选择器来测试解析数据:
    from scrapy.selector import Selector
    
    # 使用Selector解析HTML并提取数据的示例
    html = """
    <html>
        <body>
            <div class="my-class">
                <h1>标题1</h1>
                <p>内容1</p>
            </div>
            <div class="my-class">
                <h1>标题2</h1>
                <p>内容2</p>
            </div>
        </body>
    </html>
    """
    
    selector = Selector(text=html)
    div_selector_list = selector.css('.my-class')
    
    for div_selector in div_selector_list:
        title = div_selector.css('h1::text').get()
        content = div_selector.css('p::text').get()
        print(f'Title: {title}, Content: {content}')
    
    1. 检查是否使用了全局变量:如果你在Spider中使用了全局变量来存储数据,并且每次请求都会修改这些全局变量的值,那么就会导致每次yield时都传递相同的数据。确保仅在item中存储数据,并在Pipeline中处理数据。

    如果以上方法都没有解决问题,我无法提供更准确的解决方案。这可能涉及到更详细的代码和更具体的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^