BeautifulSoup4 페이지에서 참조할 내부 #js, css 선택 (+ 추가)

의 목적


이 사이트는 응답 내용에 포함됩니다.
  • http://example.com 태그로 구성된 이미지 URL
  • img 태그에서 호출된 스크립트의 URL
  • script 레이블로 된 스타일시트의 URL
  • 다음에 같은 호스트 이름에서 얻은 것만 보여 줍니다.

    코드

    import requests
    from bs4 import BeautifulSoup
    
    def _fetch_targets(url: str) -> list:
        """指定したURLにアクセスした際に、直後に取る画像,JS,CSSファイルのURLリストを作る
        """
        session = requests.Session()
        resp = session.get(f"{url}/")
        soup = BeautifulSoup(resp.content, 'html.parser')
        # Image
        img_tags = soup.find_all('img')
        img_tags_origin = [
            s.attrs['src'] for s in img_tags
            if s.attrs['src'].startswith(url)
        ]
        # JS
        script_tags = [
            s for s in soup.find_all('script')
            if 'src' in s.attrs
        ]
        script_tags_origin = [
            s.attrs['src'] for s in script_tags
            if s.attrs['src'].startswith(url)
        ]
        # CSS
        css_tags = [
            s for s in soup.find_all('link')
            if 'stylesheet' in s.attrs['rel']
        ]
        css_tags_origin = [
            s.attrs['href'] for s in css_tags
            if s.attrs['href'].startswith(url)
        ]
        # 一括加工
        targets = img_tags_origin + script_tags_origin + css_tags_origin
        return [t.replace(url, '') for t in targets]
    
    # 使い方
    if __name__ == '__main__':
        _fetch_targets('http://example.com')
    

    개요


    기본적으로link의기능을 이용하여'검색탭→특정속성에 따른 필터→모두 모아성형'등간단한구성으로
    BeautifulSoup4 해시태그는 "아무래도 src는 존재하죠"
    * img 태그는 태그에 직접 쓸 수도 있으므로 "script 속성"을 사용하여 필터링
    * src 다양한 태그가 혼합되어 있기 때문에 "link 속성은 rel"으로 필터링

    링크 태그 속성 정보


    CSSstylesheet만 탭에서 추출할 때link 속성을 사용하지만 목록이라는 것을 처음 알았습니다.

    진정한 목적

    rel를 사용한 서버에 대한 부하 테스트를 위해 목적지뿐만 아니라 이 페이지에 참조된 자원을 포함하여 처리하면 부하 테스트가 될 수 있다고 생각해서 실시했습니다.

    나머지 코드


    locustfile.py
    from locust import HttpLocust, Task, TaskSet
    
    # --------
    # この辺に、さっきの_fetch_targetsが入る
    # --------
    
    def generate_get_task(task: Task, url: str) -> callable:
        """タスクジェネレータです
        """
        def _get_task(task: Task):
            task.client.get(url)
        return _get_task
    
    
    class TopPageWithResources(TaskSet):
        """テスト振る舞いの定義セット
        """
        def __init__(self, parent):
            """アクセス対象のテストをまるごとセットする
            """
            super().__init__(parent)
            self.tasks = []
            self.tasks.append(generate_get_task(self, '/'))
            for t in _fetch_targets(self.locust.host):
                self.tasks.append(generate_get_task(self, t, counter))
    
    
    class WebsiteUser(HttpLocust):
        """テスト実行の実設定
        """
        task_set = TopPageWithResources
        min_wait = 500
        max_wait = 900
    
    왜냐하면 움직임이 늘어날 때 정확한 위치를 모르기 때문에 조사가 힘들어요.
    또한 테스트 개체 +Locust.io에서 발견된 모든 URL을 깊이_fetch_targets하여 임무를 정의하는 함수를 준비했습니다.

    이렇게 된 느낌.



    홈페이지 구성이 바뀌어도 그대로 대본으로 쓸 수 있어 개인적으로 편리하다고 생각한다.

    좋은 웹페이지 즐겨찾기