如何使用xpath从网站中提取用户名和公钥?

时间:2016-08-25 00:53:17

标签: python xpath scrapy

对于我的论文工作,我正在从bitcointalk.org收集有关用户及其比特币公钥的数据,这些公钥在他们撰写的每篇帖子的末尾都会给出(捐赠和提示)。

use_config_manage_stock

我正在尝试使用xpath从上面的语法中提取用户名值,并尝试从以下语法的签名字段中提取用户的公钥值

min_sale_qty

我提取项目的代码如下:

<td valign="top" width="16%" rowspan="2" style="overflow: hidden;" class="poster_info">
                        <b><a href="https://bitcointalk.org/index.php?action=profile;u=2786" title="View the profile of Pieter Wuille">Pieter Wuille</a></b>

代码工作正常,但它的作用是它提取所有用户名和所有比特币密钥(用户在帖子的末尾用于捐赠),并且没有办法将密钥关联到一个用户,因为他们被单独提取我想要做的是成对提取信息,以便我可以省略他们的帖子中没有指定他们的公钥(捐赠)的用户。谁能帮我?我有点卡住了

2 个答案:

答案 0 :(得分:0)

因此,您要在评论中描述的内容是找到论坛帖子中的用户访问每个个人资料,如果他们的个人资料中有比特币地址,请抓取地址及其用户名,对?这几乎就是蜘蛛:

 class BitcointalkSpider(scrapy.Spider):
    name = "bitcointalk"
    allowed_domains = ["bitcointalk.org"]
    start_urls = (
        'http://www.https://bitcointalk.org/index.php?topic=1474398.0/',
    )

    def parse(self, response):
        # find profile urls
        profiles = response.xpath("//a[contains(@title,'View the profile')]/@href").extract()
        profiles = list(set(profiles))  # only unique values
        # scrape every one of them individually
        for pro in profiles:
            yield scrapy.Request(pro, self.parse_profile)

    def parse_profile(self, response):
        bitcoin = response.xpath("//td[contains(.//text(),'Bitcoin address')]"
                                 "/following-sibling::td/text()").extract_first()
        if not bitcoin:  # no bitcoin, drop user
            return
        item = dict()
        item['bitcoin_address'] = bitcoin
        item['username'] = response.xpath("//td[contains(.//text(),'Name')]"
                                          "/following-sibling::td/text()").extract_first()
        return item

答案 1 :(得分:0)

我认为您有关于获得共同祖先的想法,以便您可以将每个作者与其公钥匹配,但我认为您缺少正确的选择器,例如尝试:

posts = response.css('.windowbg, .windowbg2')
for post in posts:
    author = post.css('.poster_info>b>a::text').extract_first()
    bitcoinkey = post.css('.signature').re_first(r'(1[1-9A-HJ-NP-Za-km-z]{26,33})')
    if author and bitcoinkey:
        print author, bitcoinkey