【问题标题】:How to use scrapy to crawl data from multipages which are implemented by javascript如何使用scrapy从javascript实现的多页中抓取数据
【发布时间】:2016-07-05 03:20:35
【问题描述】:

我想用scrapy从网页爬取数据,但是从url看不出不同页面的区别。例如:

http://epgd.biosino.org/EPGD/search/textsearch.jsp?textquery=man&submit=Feeling+Lucky

上面的url是我要爬取数据的第一页,从中获取数据很容易。

这是我的代码:

__author__ = 'Rabbit'
from scrapy.spiders import Spider
from scrapy.selector import Selector

from scrapy_Data.items import EPGD


class EPGD_spider(Spider):
    name = "EPGD"
    allowed_domains = ["epgd.biosino.org"]
    stmp = []
    term = "man"
    url_base = "http://epgd.biosino.org/EPGD/search/textsearch.jsp?textquery=man&submit=Feeling+Lucky"

    start_urls = stmp

    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath('//tr[@class="odd"]|//tr[@class="even"]')

        for site in sites:
            item = EPGD()
            item['genID'] = map(unicode.strip, site.xpath('td[1]/a/text()').extract())
            item['taxID'] = map(unicode.strip, site.xpath('td[2]/a/text()').extract())
            item['familyID'] = map(unicode.strip, site.xpath('td[3]/a/text()').extract())
            item['chromosome'] = map(unicode.strip, site.xpath('td[4]/text()').extract())
            item['symbol'] = map(unicode.strip, site.xpath('td[5]/text()').extract())
            item['description'] = map(unicode.strip, site.xpath('td[6]/text()').extract())
            yield item

但是如果我想从第2页获取数据就会出现问题。我点击下一页,第二页的url如下所示:

http://epgd.biosino.org/EPGD/search/textsearch.jsp?currentIndex=20

如你所见,它的 url 中没有关键字,所以我不知道如何从其他页面获取数据。也许我应该使用 cookie,但我不知道如何处理这种情况,所以任何人都可以帮助我。

非常感谢!

【问题讨论】:

  • 所以我没有澄清我的问题吗?如果有人想帮助我,但不知道我在问什么,您可以在此处添加评论。

标签: python scrapy


【解决方案1】:

当链接解析和请求产生被添加到你的 parse() 函数时,你的例子对我有用。也许该页面使用了一些服务器端 cookie。但是使用像 Scrapy's Crawlera 这样的代理服务(从多个 IP 下载)却失败了。

解决方法是在请求url中手动输入'textquery'参数:

import urlparse
from urllib import urlencode

from scrapy import Request
from scrapy.spiders import Spider
from scrapy.selector import Selector


class EPGD_spider(Spider):
    name = "EPGD"
    allowed_domains = ["epgd.biosino.org"]
    term = 'calb'
    base_url = "http://epgd.biosino.org/EPGD/search/textsearch.jsp?currentIndex=0&textquery=%s"
    start_urls = [base_url % term]

    def update_url(self, url, params):
        url_parts = list(urlparse.urlparse(url))
        query = dict(urlparse.parse_qsl(url_parts[4]))
        query.update(params)
        url_parts[4] = urlencode(query)
        url = urlparse.urlunparse(url_parts)
        return url

    def parse(self, response):
        sel = Selector(response)
        genes = sel.xpath('//tr[@class="odd"]|//tr[@class="even"]')

        for gene in genes:
            item = {}
            item['genID'] = map(unicode.strip, gene.xpath('td[1]/a/text()').extract())
            # ...
            yield item

        urls = sel.xpath('//div[@id="nviRecords"]/span[@id="quickPage"]/a/@href').extract()
        for url in urls:
            url = response.urljoin(url)
            url = self.update_url(url, params={'textquery': self.term})
            yield Request(url)

来自 Lukasz 解决方案的 update_url() 函数详细信息:
Add params to given URL in Python

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 2017-07-26
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多