如何将Python scrapy用于myltiple URL';s

如何将Python scrapy用于myltiple URL';s,scrapy,python-3.5,Scrapy,Python 3.5,我的问题与这篇文章类似: 我希望我的爬虫遍历所有“下一个”链接。我已经搜索了很多,但大多数人关注于如何解析ULR,或者只是将所有URL放在初始URL列表中 到目前为止,我能够访问第一个页面并解析下一个页面的链接。但我不知道如何使用相同的爬虫(spider)访问该页面。我试图将新的URL追加到我的URL列表中,它确实追加了(我检查了长度),但后来它没有访问链接。我不知道为什么 注意,在我的例子中,我只知道第一页的URL。第二页的URL只能在访问第一页后获得。相同的第(i+1)页的URL隐藏在第i

我的问题与这篇文章类似:

我希望我的爬虫遍历所有“下一个”链接。我已经搜索了很多,但大多数人关注于如何解析ULR,或者只是将所有URL放在初始URL列表中

到目前为止,我能够访问第一个页面并解析下一个页面的链接。但我不知道如何使用相同的爬虫(spider)访问该页面。我试图将新的URL追加到我的URL列表中,它确实追加了(我检查了长度),但后来它没有访问链接。我不知道为什么

注意,在我的例子中,我只知道第一页的URL。第二页的URL只能在访问第一页后获得。相同的第(i+1)页的URL隐藏在第i页中

在parse函数中,我可以解析并打印正确的下一页链接URL。我只是不知道怎么去参观

请帮帮我。谢谢大家!

import scrapy
from bs4 import BeautifulSoup


class RedditSpider(scrapy.Spider):
    name = "test2"
    allowed_domains = ["http://www.reddit.com"]
    urls = ["https://www.reddit.com/r/LifeProTips/search?q=timestamp%3A1427232122..1437773560&sort=new&restrict_sr=on&syntax=cloudsearch"]

    def start_requests(self):
        for url in self.urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                'endpoint': 'render.html',
                'args': { 'wait': 0.5 }
                }
            })
`

    def parse(self, response):
        page = response.url[-10:]
        print(page)
        filename = 'reddit-%s.html' % page
        #parse html for next link
        soup = BeautifulSoup(response.body, 'html.parser')
        mydivs = soup.findAll("a", { "rel" : "nofollow next" })
        link = mydivs[0]['href']
        print(link)
        self.urls.append(link)

        with open(filename, 'wb') as f:
            f.write(response.body)
更新 多亏了考希克的回答,我想出了如何让它发挥作用。虽然我仍然不知道为什么我最初的想法是添加新的URL不起作用。。。 更新后的代码如下:

import scrapy
from bs4 import BeautifulSoup


class RedditSpider(scrapy.Spider):
    name = "test2"
    urls = ["https://www.reddit.com/r/LifeProTips/search?q=timestamp%3A1427232122..1437773560&sort=new&restrict_sr=on&syntax=cloudsearch"]

    def start_requests(self):
        for url in self.urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                'endpoint': 'render.html',
                'args': { 'wait': 0.5 }
                }
            })


    def parse(self, response):
        page = response.url[-10:]
        print(page)
        filename = 'reddit-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)

        #parse html for next link
        soup = BeautifulSoup(response.body, 'html.parser')
        mydivs = soup.findAll("a", { "rel" : "nofollow next" })
        if len(mydivs) != 0:
            link = mydivs[0]['href']
            print(link)  
            #yield response.follow(link, callback=self.parse)
            yield scrapy.Request(link, callback=self.parse)

你需要的东西在报告中解释得很清楚。除此之外,我认为你不需要任何其他解释。为了更好地理解,建议你再看一遍


但首先要做一个简单的解释:

为了链接到下一页,Scrapy提供了许多方法。最基本的方法是使用


类scrapy.http.Request(url[,回调, 方法='GET',标题,正文,cookie,元,编码='utf-8', 优先级=0,不过滤=False,错误返回,标志])

  • url(字符串)–此请求的url
  • callback(callable)–将此请求的响应(下载后)作为其第一个参数调用的函数

不过,为了方便起见,Scrapy内置了一个快捷方式,用于通过使用url创建请求对象,其中url可以是绝对路径或相对路径

follow(url,callback=None,method='GET',headers=None,body=None, cookies=None,meta=None,encoding=None,priority=0,don_filter=False, errback=无)


如果您必须通过将值传递到表单或任何其他类型的输入字段来转到下一个链接,则可以使用。扩展了基本请求的功能 用于处理HTML表单。它使用lxml.html表单进行预填充 包含来自响应对象的表单数据的表单字段


从_响应(响应[,formname=None, formid=None,formnumber=0,formdata=None,formxpath=None, formcss=None,clickdata=None,don_click=False,…)

如果您想在spider中模拟HTML表单POST,并发送几个键值字段,您可以(从spider)返回一个FormRequest对象,如下所示:

return [FormRequest(url="http://www.example.com/post/action",
                    formdata={'name': 'John Doe', 'age': '27'},
                    callback=self.after_post)]

注意:如果请求没有指定回调,则将使用spider的parse()方法。如果在处理过程中引发异常,则改为调用errback


谢谢这有帮助!当然,很乐意帮忙!如果这是你正在寻找的,请将其标记为答案。
>>> yield response.follow(url, callback=self.next_parse)
return [FormRequest(url="http://www.example.com/post/action",
                    formdata={'name': 'John Doe', 'age': '27'},
                    callback=self.after_post)]