CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑

这篇具有很好参考价值的文章主要介绍了CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

tip: 超链接对应的文案通常被称为“锚文本”(anchor text)

在继承CrawlSpider父类的前提下,编写一个 fetch_referer 方法获取当前response.url的父链接和锚文本。 

实现逻辑,通过一个例子简要说明:

  1. 如果设置 start_url="www.baidu.com", Rule(LinkExtractor())匹配链接的规则是任何链接。 
  2. 那么第一个为 response.url="www.baidu.com",假设 www.baidu.com 的response的页面源码存在链接 www.ibaidu.com, www.etbaidu.com;那么此时 refere_extract_link = {"www.baidu.com": ["www.ibaidu.com","www.etbaidu.com"]};进入for循环判断,因为 response.url="www.baidu.com"不匹配list的links ["www.ibaidu.com","www.etbaidu.com"] 的任何一个,所以链接 www.baidu.com 的父链接 referer_url 和 锚文本 referer_url_text 都为None。
  3. scrapy CrawlSpider会将links的链接继续提交给下载器访问,response.url 重新被赋值为 response.url = "www.ibaidu.com",假设 www.ibaidu.com 的response的页面源码存在链接 "www.ibaidu_child.com","www.ibaidu_second.com";那么此时 refere_extract_link = {"www.baidu.com": ["www.ibaidu.com","www.etbaidu.com"], "www.ibaidu.com": ["www.ibaidu_child.com","www.ibaidu_second.com"]};进入for循环判断,因为 response.url="www.ibaidu.com" 匹配list的links ["www.ibaidu.com","www.etbaidu.com"] 的"www.ibaidu.com",而该list的key是 www.baidu.com,所以链接 www.ibaidu.com 的父链接 referer_url = “www.baidu.com”, 锚文本referer_url_text = "百度一下,你就知道"。
  4.  其它链接重复步骤3,最后把所有链接的父链接和锚文本存储到itme里面。

完整代码:

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from developer_docs_scrapy.items import DeveloperDocsScrapyItem
from helpers.operate_redis import operate_redis
 
# 从redis获取配置
env_config = operate_redis().env_redis_config()
print(env_config)
 
 
class DeveloperDocsSpider(CrawlSpider):
    name = env_config["spider_name"]  # "developer-docs"
    allowed_domains = [env_config["spider_allowed_domains"]]  # ["org.com"]
    start_urls = [env_config["spider_start_urls"]]  # ["https://developer.org.com/docs-service/"]
    # allow: 满足括号中的're'表达式的url会被提取,如果为空,则全部匹配
    # deny: 满足括号中的're'表达式的url不会被提取,优先级高于allow
    # deny要放在同一个linkextrator里面,不然,其它link规则会爬取deny的链接
    # 为了过滤非文档中心的链接,如:网页存在大量的org.com域名的新闻页面,所以,设置爬取规则:
    # 允许爬取URL包含初始URL的链接,如:https://developer.org.com/docs-service/search-result/?keyword=API 包含 https://developer.org.com/docs-service/
    rules = [Rule(LinkExtractor(allow=(start_urls), deny=()), process_links="deal_links", callback="parse_item", follow=True),
            #  Rule(LinkExtractor(deny=r'knowledge'))  
             ]
  
    # 从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。或者对获取的url进行修改后再进行请求下载
    def deal_links(self, links):
        print("deal_links")
        for link in links:
            print(link, link.url, link.text)
            # 修改link的url
            # link.url = link.url.resplace("","").replace("","")
        return links
 
    refere_extract_link = {}
 
    def parse_item(self, response):
        item = DeveloperDocsScrapyItem()
        item["url"] = response.url
        # 从redis读取需要匹配元素xpath路径
        # redis读取的是str的列表,用eval转成list类型
        title_xpaths = eval(env_config["title_xpaths"])
        for xpath in title_xpaths:
            # 获取链接访问后的response获取的xpath内容
            selected_titles = response.xpath(xpath).extract()
            # 如果不为空,则存储改内容且退出当前for循环,不执行else内容
            if selected_titles:
                item["title"] = selected_titles[0]
                break
        # 如果for循环所有list后,selected_titles都为空,则执行else
        else:
            item["title"] = None
        referer_url, referer_url_text = self.fetch_referer(response=response)
        item["referer_url"] = referer_url
        item["referer_url_text"] = referer_url_text
        yield item
 
    def fetch_referer(self,response):
        """
        获取跳转到 response.url 的父链接 referer_url 和 父链接的文案 referer_url_text
        """
        # 获取url访问后的response里面的链接(从源码中摘取部分)
        seen = set()
        for rule_index, rule in enumerate(self._rules):
            links = [
                # 提取 response.url的页面的 链接+【链接文案】存储在list
                lnk.url + "【" + lnk.text + "】" for lnk in rule.link_extractor.extract_links(response) if lnk not in seen
            ]
        # print(response.url, links)
        # 把每一个链接访问后的页面获取到的链接组成 key: list 存储到 refere_extract_link
        self.refere_extract_link.update({response.url: links})
        # print(self.refere_extract_link)
        # 判断每一个response.url是否在refere_extract_link字典的所有links中,如果是,表示是从链接key访问的页面获取的,key是父链接
        for key,value in self.refere_extract_link.items():
            for v in value:
                extract_url = v[0:v.find("【")]
                extract_url_text = v[v.find("【")+1: v.find("】")]
                if response.url == extract_url:
                    referer_url = key
                    referer_url_text = extract_url_text
                    return referer_url, referer_url_text
        else:
            # 如果refere_extract_link字典的所有links都没有满足条件return,就会执行else
            return None, None
"""
当迭代对象完成所有迭代后且此时的迭代对象为空时,如果存在else子句则执行else子句,没有则继续执行后续代码;
如果迭代对象因为某种原因(如带有break关键字)提前退出迭代,则else子句不会被执行,程序将会直接跳过else子句继续执行后续代码
"""

备注:逻辑想法记录,方便以后可以直接复用文章来源地址https://www.toymoban.com/news/detail-823761.html

到了这里,关于CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp 微信小程序获取当前位置定位不准确问题 uniapp 微信小程序获取当前位置的坐标(经纬度),通过坐标去获取当前具体地址

    点击获取定位-位置授权-显示地址信息 1 2、 3、 以下3处(!!!必需)必须满足 manifest.json(!!!必需)

    2024年02月08日
    浏览(72)
  • Vue实现当前页面禁止鼠标右键,复制文本内容和F12

    只在mounted()里面写下面的代码,在进入这个页面前其他页面是能正常的使用鼠标右键,复制文本内容和F12,但进入当前页后再出来就会影响到其他页面 所以要做到只控制当前页,我们需要在 destroyed()钩子中把这些禁止重新打开 ,这样就能实现该功能了 重新打开

    2024年02月08日
    浏览(39)
  • 【UE】富文本块(RichTextBlock) 增加超链接支持

    RichTextBlock使用方式参考官方文档:RichTextBlockUE 文档中描述了不同样式文字以及图片的使用,但没有具体说明超链接的实现,但库中有hyperlink结构。 因此照猫画虎实现,仿照RichImgDecorator实现。 首先在build.cs 里增加Slate引用 编写SRichTextHyperlink_Ex.h文件 基于SRichTextHyperlink的拓展

    2024年02月09日
    浏览(32)
  • android 12.0Launcher3长按拖拽时,获取当前是哪一屏,获取当前多少个应用图标

    在12.0定制化开发手机项目中,如果专门适配老年机的时候,这时客户提出要求,如果最后一屏未满时,不让拖拽到后面一屏的空屏中这样就需要获取当前是哪一屏,并且要知道当前有多少个Item,总共一屏最多多少个item 所以就需要从Workspace.java入手,来分析解决这个问题 首选

    2024年02月06日
    浏览(61)
  • MFC获取当前程序路径

    可以获取exe的路径,但是当用文件对话框成功打开一个文件后,该目录就被修改为被打开的文件所在目录。 获取的是当前exe的路径。 建议使用这种方法。 如,打开C盘 打开CMD 打开计算器 打开txt文件

    2024年02月17日
    浏览(55)
  • java获取当前系统时间

      在Java中,可以使用以下几种方法获取当前系统时间: 方法1:使用java.util.Date类 ```java import java.util.Date; public class Main { public static void main(String[] args) { Date date = new Date(); System.out.println(\\\"当前时间:\\\" + date); } } ``` 方法2:使用java.time.LocalDateTime类(推荐,自Java 8引入

    2024年02月11日
    浏览(68)
  • uniapp获取当前路由地址

    最近开发中有跳过或者返回的需求 所以需要获取到当前页面的路径 建议将代码放到公共js里面,所有也能均可调用 存入缓存中 如销毁:在离开页面时remove即可

    2024年02月16日
    浏览(34)
  • 获取当前北京时间API

    我们经常要获取系统当前时间,但是如果通过前端去 new Date() 获取的是当前电脑的时间。下面提供几个大公司的获取时间的  API  。 苏宁易购获取当前时间API url:https://f.m.suning.com/api/ct.do 返回值: 京东获取当前时间API url:https://a.jd.com//ajax/queryServerData.html 返回值: 淘宝获

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包