Scan.co.uk 판매 스크래퍼

저는 오늘 Scan.co.uk에서 판매 품목을 가져와서 .csv 파일로 데이터를 수집하는 스크레이퍼 작업을 하고 있었습니다. 멋진 것은 없습니다. 유일한 가치는 교육적입니다. 그리고 적절하게도, 간단한 bs4 스크립트는 언급할 가치가 있어 보이는 두 가지 문제를 던졌습니다.
  • HTTP 오류 403 - 서버에 대한 액세스 권한이 부여되지 않아 html을 가져올 수 없습니다. 얼마나 답답한가!
  • x.findAll()이 모든 결과를 반환하지 않습니다. 6개의 'li' 컨테이너를 가져오려고 했지만 함수에서 4개만 찾았습니다. 무엇을 합니까?

  • HTTP 오류 403: 금지됨



    이것은 urllib 헤더와 관련이 있습니다. 웹 사이트는 수많은 스크래퍼의 요청을 처리하는 데 랩핑되기를 원하지 않으므로 urllib로 향하는 요청이 차단됩니다.

    이 문제를 해결하려면 스크래핑 봇을 실행하고 있다는 사실을 모호하게 해야 합니다. 이를 수행하는 가장 간단한 방법은 다음과 같이 헤더를 사용하는 것입니다.

    req = Request(my_url, headers={'User-Agent': 'Mozilla/5.0'})
    page = urlopen(req)
    page_html = page.read()
    page.close()
    


    처음에는 이것이 작동하지 않았습니까?

    따라서 다음은 Zeta 사용자StackOverflow의 또 다른 분명히 오래된 솔루션입니다.

    import urllib.request
    
    class AppURLopener(urllib.request.FancyURLopener):
        version = "Mozilla/5.0"
    
    uClient_opener = AppURLopener()
    uClient = uClient_opener.open(my_url)
    


    이것은 레거시 솔루션으로 보이며 선호되지 않습니다. 결국 두 솔루션 모두 오타를 제외하고 저에게 효과적이었습니다.

    x.findAll()은 모든 결과를 반환하지 않습니다.




    product_list = product_categories[x].findAll('li')
    


    위의 코드는 6개의 결과를 반환했어야 했지만 4를 넘을 수 없었습니다.

    일부 인터넷 검색에서는 이것이 html_parser의 문제라고 제안했습니다. 제안된 솔루션 - html5lib를 사용하십시오.

    이것은 BeautifulSoup으로 html을 파싱하는 모습입니다.

    page_soup = soup(page_html, 'html_parser')
    product_categories = page_soup.findAll('div', {'class':'category'})
    


    코드 변경은 최소화됩니다. html_parser 변수를 html5lib로 바꾸면 됩니다.

    import html5lib
    
    page_soup = soup(page_html, 'html5lib')
    product_categories = page_soup.findAll('div', {'class':'category'})
    


    그리고 그것은 작동합니다! User-Agent 내가 찾고 있던 올바른 6을 반환합니다.

    누군가가 도움이되기를 바랍니다.

    좋은 웹페이지 즐겨찾기