gpt4 book ai didi

python - 无法理解在源代码中查找何处以创建网络抓取工具

转载 作者:行者123 更新时间:2023-12-01 05:53:22 25 4
gpt4 key购买 nike

我是Python新手,从今年夏天开始就断断续续地自学。我正在学习 scrapy 教程,偶尔阅读更多有关 html/xml 的内容来帮助我理解 scrapy。我自己的项目是模仿scrapy教程来抓取http://www.gamefaqs.com/boards/916373-pc 。我想获取线程标题和线程 url 的列表,应该很简单!

我的问题在于不理解xpath,我猜还有html。当查看 gamefaqs 网站的源代码时,我不确定要查找什么才能提取链接和标题。我想说只需查看 anchor 标记并抓取文本,但我对如何操作感到困惑。

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

我想改变它以在游戏常见问题上工作,那么我会在这条路径中放入什么?我想象程序返回的结果是这样的线程名称话题网址我知道代码不太正确,但有人可以帮我重写它以获得结果,这将帮助我更好地理解抓取过程。

最佳答案

网页的布局和组织可能会发生变化,并且基于深度标签的路径可能难以处理。我更喜欢对链接文本进行模式匹配。即使链接格式发生变化,匹配新模式也很简单。

对于游戏常见问题解答,文章链接如下所示:

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

这是协议(protocol)、域名、字面“板”路径。 “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 将是一个字符串,适合填写 URL 模板,但如果需要计算之前的 ID 等,则将其转换为数字:

idInt = int(idStr)

我希望这会有所帮助。

关于python - 无法理解在源代码中查找何处以创建网络抓取工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com