唔明到哪里寻找源代码,以创建一个Web刮板(Having trouble understanding

2019-09-26 09:50发布

我使用python小白,一直开启和关闭,因为今年夏天自学。 我经历的scrapy教程,偶尔阅读更多关于HTML / XML来帮助我了解scrapy。 我对自己的项目是模仿scrapy教程,以刮http://www.gamefaqs.com/boards/916373-pc 。 我想与线程URL相处的主题标题的列表,应该是简单的!

我的问题就在于不理解的XPath,也html的我想。 在查看了现场gamefaqs上的源代码,我不知道如何查找在以拉链接和标题内容。 我想说的只是看在锚标记,并抓住文字,但我对如何迷惑。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from tutorial.items import DmozItem

class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains = ["http://www.gamefaqs.com"]
start_urls = ["http://www.gamefaqs.com/boards/916373-pc"]


def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//a')
    items = []
    for site in sites:
        item = DmozItem()
        item['link'] = site.select('a/@href').extract()
        item['desc'] = site.select('text()').extract()
        items.append(item)
    return items

我想改变这种对gamefaqs上工作,所以我会放什么东西在这条道路? 我想象中的程序返回的结果是这样的线程名线程网址我知道代码是不是真的正确的,但有人可以帮我改写这个来获得结果,这将有助于我理解刮研工艺更好。

Answer 1:

网页的布局和组织可以改变和深度标签基于路径可能难以应付。 我宁愿模式匹配的链接的文本。 即使该链接的格式变化,匹配的新格局很简单。

对于gamefaqs上的文章链接如下所示:

http://www.gamefaqs.com/boards/916373-pc/37644384

这是协议,域名,文字“板”路径。 “916373-PC”标识的论坛区和“37644384”是文章ID。

我们可以配合使用使用正则表达式的特定区域论坛链接:

reLink = re.compile(r'.*\/boards\/916373-pc\/\d+$')
if reLink.match(link)

或使用任何论坛区域使用:

reLink = re.compile(r'.*\/boards\/\d+-[^/]+\/\d+$')
if reLink.match(link)

附加链接匹配你的代码我们得到:

import re
reLink = re.compile(r'.*\/boards\/\d+-[^/]+\/\d+$')

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//a')
    items = []
    for site in sites:
        link = site.select('a/@href').extract()
        if reLink.match(link)
            item = DmozItem()
            item['link'] = link
            item['desc'] = site.select('text()').extract()
            items.append(item)
    return items

很多网站都有独立的摘要和详细信息页面或在路径匹配的文章ID模板说明和文件的链接。 如果需要,您可以分析论坛区和文章ID是这样的:

reLink = re.compile(r'.*\/boards\/(?P<area>\d+-[^/]+)\/(?P<id>\d+)$')
m = reLink.match(link)
if m:
    areaStr = m.groupdict()['area']
    idStr = m.groupdict()['id']

isStr将是一个字符串,罚款网址范本中的填充,但是如果你需要计算以前的ID等,然后将其转换为数字:

idInt = int(idStr)

我希望这有帮助。



文章来源: Having trouble understanding where to look in source code, in order to create a web scraper