Scrapy:如何请求刮取页面内的链接

时间:2017-07-19 21:33:55

标签: python python-3.x xpath scrapy scrapy-spider

我已经提出了一个关于这个网站的问题,但我认为我已经领先于事实,现在我被困住了。

网站的结构是这样的:

<table>
<tr>
<td class="header" colspan="2">something</td>
</tr>

</table>
<br/>
<table> 
<tr>
<td class="header" colspan="2">something2</td>
</tr>

</table>
<br/>
<table>
<tr> 
<td class="header" colspan="2">something3</td>
</tr>
</table>

但是在其中一个表中有一个成员列表,我需要提取每个成员的配置文件信息,但每个配置文件都是可变的,因此根据隐私设置,表及其信息会发生变化。 / p>

我需要刮的表是这样的,但有许多成员:

<table>
            <tr>
                <td colspan="4" class="header">members</td>
            </tr>
            <tr>
                <td class="title">Name</td>
                <td class="title">position</td>
                <td class="title">hours</td>
                <td class="title">observ</td>
            </tr>

            <tr>
                <td class="c1">       
                    1.- <a href="http://profiletype1.com" target="_blank">Homer Simpson</a>
                </td>
                <td class="c1">
                    safety inspector
                </td>
                <td class="c1">
                    10
                </td>
                <td class="c1">
                    Neglect his duties
                </td>
            </tr>
<table>

我已经有大部分代码从表中提取信息,但现在我不明白如何执行允许我从每个成员的配置文件中提取信息的功能

我的蜘蛛以这种方式定义:

class Scraper(scrapy.Spider):
    name = 'scraper'
    start_urls = ['somesite.com']

    rules = {
    # Rule to extract profile info
    Rule(LinkExtractor(allow =(), restrict_xpaths = ('/table[6]//tr/td[1]')),
                        callback = 'parse_member', follow = False)
}
def parse(self, response):
  # logic to scrape each table

def parse_member(self,response):
  # logic to scrape each profile for every member

但是当我运行蜘蛛时,我只得到提取主页内每个表的结果。但我没有得到每个用户个人资料的数据。

我如何关注每个用户配置文件的链接并在不破坏代码的情况下抓取内部数据来刮取主页内的表格?

1 个答案:

答案 0 :(得分:0)

我认为你根本不需要Rule,你可以这样做:

def parse(self, response):
    tables = response.xpath('//table[./tr/td[contains(text(), "members")]]')
    for table in tables:
        for href in table.css('tr td a::attr(href)'):
            yield Request(href, callback=self.parse_member_profile)

def parse_member_profile(self, response):
    ...