업무 기회에 따라 사이트를 검색하다.

안녕하세요.오늘 학교에 가세요?나는 네가 오늘 즐겁게 지내길 바란다:D.
오늘 저는 여러분과 제가 전자상거래 사이트를 긁은 후의 경험을 공유하고 싶습니다. 이 사이트의 이름은 Zomato입니다.내가 이 사이트를 긁어 현실 세계를 실천하는 상황에서 나는 아이디어를 얻은 후에 업무가 제공하는 UpWork를 보았다.
작업 설명:
이 고객은 Zomato 사이트에서 호주의 멜버른의 일부 유형에서 상업 정보를 얻을 것을 요구한다.종류는 카페, 중국식, 만두, 프랑스식 등이 있다.모든 데이터는 스프레드시트에 삽입해야 합니다.
고객이 수집하고자 하는 데이터입니다.

이 글에서, 나는 이 일을 완성하는 데 가장 낮은 요구를 알려주려고 한다. 더 많은 것을 개발할 수 있거나, 아니면 나를 볼 수 있다GitHub.
뭐 공부 해요?
주로 데이터를 캡처하여 거의 항상 HTTP 요청을 보내고 응답을 확인합니다.필요한 라이브러리는 requestbeautifulsoup4 입니다.
어떻게 설치합니까?
pip 명령을 사용하여 라이브러리를 설치하려면:
  • pip install requests
  • pip install beautifulsoup4
  • 그 라이브러리 외에 물론 제가 긁고 싶은 URL이 필요합니다.URL입니다.: https://www.zomato.com/melbourne/restaurants/cafes.
  • 주요 분야→ https://www.zomato.com/
  • 후접자역→ 멜버른/식당/카페.이 자역은 고객이 요구하는 것이고, 마지막 카페는 유형이다.
  • 시작하겠습니다.
    1단계.나는python 파일을 만들어서main이라고 명명했습니다.파일의 맨 위에 라이브러리를 가져왔습니다.
    import requests
    from bs4 import BeautifulSoup
    
    단계 2.그 후, 나의 다음 단계는 테스트 사이트가 어떤 응답을 주었는지 하는 것이다.많은 응답 코드가 있습니다. 모든 정보를 알고 싶으면 이 코드를 보십시오link😆. 아마도 네가 익숙한 것은 404 코드일 것이다. 웹 페이지는 찾지 못했다.그것을 검사하는 방법.
    res = requests.get('https://www.zomato.com/melbourne/restaurants/cafes')
    
    print(res.status_code)
    # 403
    
    사용requests, 내 클래스:
    I:"헤이, 형님, 저 get 화물 괜찮아요?"
    사이트: "당신의 상태 코드를 먼저 보겠습니다. 403입니다. 당신이 그것을 원한다는 것을 알지만, 당신은 그것을 가질 수 없습니다."
    기다리다뭐 공부 해요?내 여행에서, 이것은 내가 처음으로 403을 상태 코드로 얻은 것이다.내가 원하는 것은 200이다. 이것은 성공을 의미한다.
    나는 인터넷에서 해결 방안을 찾으려고 시도했는데, 다행히도 내가 찾았다.내 코드는 "서버와 네트워크 쌍방이 응용 프로그램을 식별할 수 있도록 하는 특징 문자열"이라는 User-Agent 이 필요합니다. 자세한 내용은 이 link 를 참조하십시오.
    나의 이해에 따르면, 내가 이 사이트를 요청하려고 할 때, 그것은 내가 제기한 요청을 식별할 수 없지만, 나를 들어가게 하지 않기 때문에, 나는 코드에 위장을 추가해야 한다.이것이 바로 User-Agent 한 일이다.Zomato 사이트의 측면에서 볼 때, 나의 코드는 브라우저와 같다.
    그래서 내 코드는 지금 이렇게 보인다.
    import requests
    from bs4 import BeautifulSoup
    
    res = requests.get('https://www.zomato.com/melbourne/restaurants/cafes', headers={'User-Agent': 'Mozilla/5.0'})
    
    print(res.status_code)
    # 200
    
    지금 그것은 나에게 200을 상태 코드로 주어 OK를 표시한다.아름답다
    3단계.대문이 열렸습니다. Beautiful Soup으로 데이터를 수집할 때가 되었습니다.네, 이 코드를 썼습니다.
    soup = BeautifulSoup(res.text, 'html.parser')
    
    print(soup)
    # <!DOCTYPE html>
    # <html lang="en" prefix="og: http://ogp.me/ns#">
    # ...
    # </html>
    
    내가 설명할게.
  • res.text → 위의 요청(2단계)에서 HTML을 텍스트로 사용하고 싶습니다.
  • html.parser → python이 가지고 있는 해상도 라이브러리입니다.해상도에 관해서는 table 를 보실 수 있습니다.
  • 마지막으로 soup을 인쇄할 때 URL의 HTML 코드를 보여 줍니다.
  • 4단계.고객이 원하는 가치를 추출합니다.우리 먼저 요리를 찾읍시다.나는 inspect 요소 기능을 선택하기 위해 사이트를 열고 마우스 오른쪽 단추를 눌렀다.
    저거 뭐 하는 거야?이 단계는 요리 텍스트가 포함된 HTML 태그를 검색하는 데 사용됩니다.

    gif에서 요리가 포함된 검색 라벨을 볼 수 있습니다.태그 h1 에는 몇 가지 클래스 이름이 있습니다.inspect 요소 위에서, 나는 HTML을 검색하고 클래스를 복사해서 몇 개의 클래스가 같은 이름을 가지고 있는지 확인합니다.
    사용search_title에는 일치하는 항목이 하나밖에 없습니다. 사용mb0에는 8개의 일치하는 항목이 있습니다.그래서 이 단계에서 나는 search_title 요리를 찾았다.
    cuisine = soup.find('h1', class_='search_title').text
    
    print(cuisine)
    # Cafe Restaurants in Melbourne
    
    결과가 하나만 필요하므로 find (자세한 내용은 link 를 클릭하십시오.괄호에는 레이블의 이름h1, 속성class 및 이름search_title이 있습니다.class 뒤에 밑줄을 추가하는 것을 잊지 마십시오. 밑줄을 치지 않으면python에도 이 키워드가 있기 때문에 오류가 발생합니다.
    마지막 부분의 text 에 관해서는 필요한 태그 사이의 텍스트를 얻기 위한 것입니다.만약 네가 그것을 쓰지 않는다면, 반응은 이렇게 될 것이다.결과에는 태그가 포함됩니다.
    # <h1 class="search_title ptop pb5 fn mb0 mt10">
    #     Cafe Restaurants in Melbourne
    # </h1>
    
    받았어요?만약 없다면, 아래의 평론에서 저에게 물어보세요. 저는 최선을 다해 당신을 도울 것입니다. 우리는 함께 공부할 수 있습니다.😆.
    아...이 문서를 작성할 때 다음 그림과 같이 페이지가 나타납니다.

    나머지 값을 계속 추출합시다.기본적으로 절차는 요리를 추출하는 것과 같다.나는 단지 텍스트 위치를 찾아 표시와 클래스 이름을 전달할 수 있을 뿐이다.
    조직의 경우:
    organisation = soup.find('a', class_='result-title').text
    print(organisation)
    # Country Cob Bakery
    
    관련 음식:
    asso_cuisine = soup.find('span', class_='col-s-11 col-m-12 nowrap pl0').text
    print(asso_cuisine)
    # Coffee and Tea, Cafe Food
    
    나한텐 어렵지 않아, 내가 깨달을 때까지...
    고객이 제공한 견본을 보았을 때 위치와 주소는 같은 위치에 있습니다.우선, 나는 텍스트를 얻으려고 한다.
    test = soup.find('div', class_='search-result-address').text
    print(test)
    # 951 Mountain Highway, Boronia, Melbourne
    
    보이시나요?그것은 라벨 안의 모든 것을 주었지만, 나는 어떻게 951 산악 도로나 단지 볼로니아를 얻을 수 있는지 모르겠다.나는 가능한 해결 방안을 찾으려고 몇 시간 동안 곤혹스러웠다.잠시 후, 나는 몇 가지 도안을 알아차렸고, 이 그림을 보았다.

    이미지 Y입니다.
    성급 이하에는 고객이 원하는 위치가 있습니다.그래서 나는 주소의 같은 줄에서 위치를 얻을 필요가 없다.이때 나는 "가장 중요한 것은 내가 고객이 원하는 것을 제공할 수 있다는 것이다."라고 생각한다.
    위치를 잡는 방법을 찾았습니다.곧, 나는 위치를 포함하는 라벨을 검색한 후에 텍스트를 얻었다.
    위치:
    location = soup.find('a', class_='search_result_subzone').text
    print(location)
    # Boronia
    
    내가 장애물을 통과할 수 있게 되자 나는 자연스레 기뻤다.그러나 얼마 지속되지 않아 나는 또 다른 장애가 생각났다.어떻게 주소를 얻습니까...?
    나는 내가 정규 표현식에 관한 책을 읽은 것을 기억한다. 그것은 내가 필요로 하는 것처럼 보이지만, 나는 여전히 잘 모른다.나는 인터넷에서 그것을 검색하려고 시도했다. 나는 대략 split() 을 찾았다.처음에 나는 split()이 정규 표현식의 일부분이라고 생각했지만, 그것은 아니었다.split() 문자열을 부분적으로 나누고 목록으로 되돌리는 데 사용됩니다.
    str.split([separator [, maxsplit]])
    
    구분자가 정의되지 않으면 기본적으로 split 공백 (공간, 줄 바꿈 등) 은 구분자로 간주됩니다 link.
    네, 알겠습니다. 하지만 또 다른 곤혹이 생겼습니다. 저는 무엇을 구분표로 해야 합니까?
    Y 이미지를 다시 한 번 보겠습니다. 주소는 앞에 있는 쉼표(,) 뒤에 공백과 위치입니다.→ 멜버른 볼로니아 산악 도로 951번지.마지막으로, 나는 그것들을 구분자로 사용하려고 시도했다.
    주소:
    address = soup.find('div', class_='search-result-address').text
    
    separator = f', {location}'
    address = address.split(separator)
    
    print(address)
    # [' 951 Mountain Highway', ', Melbourne']
    
    print(address[0])
    # 951 Mountain Highway
    
    목록에 없는 구분자입니다.주소만 얻고 싶어서 색인 -0을 사용합니다.목록이 0 (0) 으로 시작하기 때문입니다.
    휴대폰:
    phone = soup.find('a', class_='res-snippet-ph-info')['data-phone-no-str']
    print(phone)
    # 03 9720 2500
    
    전체 코드는 다음과 같습니다.
    import requests
    from bs4 import BeautifulSoup
    
    res = requests.get('https://www.zomato.com/melbourne/restaurants/cafes', headers={'User-Agent': 'Mozilla/5.0'})
    
    soup = BeautifulSoup(res.text, 'html.parser')
    
    cuisine = soup.find('h1', class_='search_title').text
    organisation = soup.find('a', class_='result-title').text
    asso_cuisine = soup.find('span', class_='col-s-11 col-m-12 nowrap pl0').text
    location = soup.find('a', class_='search_result_subzone').text
    address = soup.find('div', class_='search-result-address').text
    test = soup.find('div', class_='search-result-address').text
    phone = soup.find('a', class_='res-snippet-ph-info')['data-phone-no-str']
    
    separator = f', {location}'
    address = address.split(separator)
    address = address[0]
    
    단계 5.주 파일 위에 csv 파일을 출력하고 싶기 때문입니다.py 파일 I는 csv 모듈을 포함합니다.이후에 나는 파일을 만드는 코드를 작성하고 값을 파일에 입력했다.
    import csv
    
    # Create csv file
    writer = csv.writer(open('./result.csv', 'w', newline=''))  # method w -> write
    headers = ['Cuisine', 'Assosiation Cuisine', 'Organisation', 'Address', 'Location', 'Phone']
    writer.writerow(headers)
    
    솔직히 말하면, 내가 코드를 작성할 때, 나는 open() 함수가 결과를 열 것이라는 것을 안다.csv, 그러나 나머지는 csv.writer()의 일부분이라고 생각합니다.그러나 나는 왜 나의 뇌가 주의력을 집중할 수 없는지 모르겠다open()는 함수이다.csv.writer()의 일부가 아니다.open() 기능 이해우선 csv 파일의 이름을 씁니다. w write 방법입니다.문서에 따라 newline 일반적인 줄 바꿈 문자 모드를 제어하는 데 사용됩니다. (텍스트 모드에만 적용됩니다.)None,,\n, r 및\r\n일 수 있습니다. 참조linkcsv.writer 사용자 데이터를 구분자가 있는 문자열로 변환하고 writer.writerow() 한 번에 한 줄에 기록합니다.→ link
    # Add the value to csv file
    writer = csv.writer(open('./result.csv', 'a', newline='', encoding='utf-8'))  # method a -> append
    data = [cuisine, asso_cuisine, organisation, address, location, phone]
    writer.writerow(data)
    
    상술한 해석과 거의 같지만 다른 점은 그 방법a, a이 추가되었다는 점이다.이것 괜찮아요?→ link
    최종 코드는 다음과 같습니다.
    import csv
    import requests
    from bs4 import BeautifulSoup
    
    res = requests.get('https://www.zomato.com/melbourne/restaurants/cafes', headers={'User-Agent': 'Mozilla/5.0'})
    
    soup = BeautifulSoup(res.text, 'html.parser')
    
    cuisine = soup.find('h1', class_='search_title').text
    organisation = soup.find('a', class_='result-title').text
    asso_cuisine = soup.find('span', class_='col-s-11 col-m-12 nowrap pl0').text
    location = soup.find('a', class_='search_result_subzone').text
    address = soup.find('div', class_='search-result-address').text
    test = soup.find('div', class_='search-result-address').text
    phone = soup.find('a', class_='res-snippet-ph-info')['data-phone-no-str']
    
    separator = f', {location}'
    address = address.split(separator)
    address = address[0]
    
    writer = csv.writer(open('./result.csv', 'w', newline=''))  # method w -> write
    headers = ['Cuisine', 'Assosiation Cuisine', 'Organisation', 'Address', 'Location', 'Phone']
    writer.writerow(headers)
    
    writer = csv.writer(open('./result.csv', 'a', newline='', encoding='utf-8'))  # method a -> append
    data = [cuisine, asso_cuisine, organisation, address, location, phone]
    writer.writerow(data)
    
    그렇습니다.이것은 최소한의 사이트를 긁는 것이기 때문에 당연히 추가해야 할 것이 많다.예를 들어 모든 데이터를 교체해서 가져오고, 다음 페이지의 값을 얻기 위해 페이지를 추가합니다.
    그러나 이 문장에서 나는 내가 처음부터 시작한 여정을 공유하고 싶다. 이 문장을 너무 길게 읽지 않도록.아마도 다음 문장에서 나는 나의 여정을 계속 공유할 것이다.읽어주셔서 감사합니다.
    P, 부끄러워하지 말고 질문하세요. 만약 무슨 오류(코드나 나의 해석)가 발견되면 아래 댓글에서 알려주세요.미리 감사합니다.

    좋은 웹페이지 즐겨찾기