2017-11-11 3 views
0

나는 파이썬으로 웹 스크랩하는 세계에 처음 왔지만 내가 궁극적으로 개발하고자하는 기술은 스크랩 한 데이터를 데이터베이스에 저장하고 그 데이터를 주기적으로 새로 고치는 것이다.Python Beautiful Soup WebScraping : 새로운 데이터 만 반환 하시겠습니까?

내 질문은 : 마지막으로 스크립트를 실행 한 이후로 새 데이터 만 요청하려면 어떻게 데이터 요청 (시간, 대역폭 사용)을 줄이시겠습니까?

예를 들어

, 내 코드는 웹 사이트 Autotrader에 자동차의 목록을 반환

data = pd.DataFrame(columns=['A']) 

#Print the name_box results to see them 
for listing in range(len(name_box)): 
    temp = name_box[listing] 
    value = temp.text 
    data = data.append({'A' : value}, ignore_index=True) 
대신 데이터베이스를 사용하는

from bs4 import BeautifulSoup 
import requests 

#URL and headers so it thinks we are a browser 
url = "https://www.autotrader.co.uk/car-search?search-target=usedcars&is-quick-search=true&radius=&onesearchad=used&onesearchad=nearlynew&onesearchad=new&make=AC&model=&price-from=&price-to=&postcode=sw65bg" 
headers = {'User-Agent' : 'Mozilla/5.0'} 

#Request 
request = requests.get(url, headers) 

soup = BeautifulSoup(request.text, "html.parser") 

#Find the name box 
name_box = soup.find_all('h2', attrs={'class' : 'listing-title'}) 

#Print the name_box results to see them 
for listing in range(len(name_box)): 
    temp = name_box[listing] 
    value = temp.text 
    print(value) 

, 내 질문을 설명하는 데 도움이 dataframe에 출력을 저장할 수 있습니다 출력

:

A 
0 AC Cobra 6.3 2dr 
1 AC Cobra 4.9 MK IV 2dr 
2 AC Cobra 3.5 2dr 
3 AC Cobra 3.5 2dr 
4 AC Cobra 5.3 2dr 
5 AC Cobra 5.7 
6 AC Cobra 4736 Built By Gardner Douglas 4.7 2dr 
7 AC Cobra 5.7 
8 AC Cobra 5.7 2dr 
9 AC Cobra 5.8 

을 10 번째 AC 코브라 웹 사이트에 게재 된 경우이며, 새 항목을 표시 할 수 있도록 해당 항목을 표시하거나 추가하는 방법이 있습니다.

답변

0

페이지가 ETag header (기본적으로 페이지의 체크섬)을 전송하는 경우 해당 페이지를 데이터베이스 화하고 다음 요청시 보냅니다. 변경 사항이없는 경우 서버는 304 (변경 사항 없음)을 보내고 중지 할 수 있습니다.

페이지가 Last-Modified header을 보내는 경우 데이터베이스에 데이터베이스 화하고 다음 요청에서 Last-Modified 헤더와 비교할 수 있습니다. 처리를 저장하려면 긁기 전에 헤드를 확인하십시오. 페이지가 거의 변경되지 않으면 대역폭을 downloading only the header까지 절약 할 수 있습니다. 페이지가 마지막 타임 스탬프보다 최신인지에 따라

또는 더 나은, If-Modified-Since header에 요청을 보내고, 서버가 304 또는 200 (전체 응답)를 반환해야합니다.

물론 이 모든 것은 유용한 헤더를 보내고 처리하여 좋은 서버/페이지 소유자 인에 달려 있습니다. 죄송 합니다만 예문 페이지에 ETag 또는 Last-Modified 헤더가 표시되지 않습니다.

궁극적으로 새 데이터가 없다는 것을 확인하는 유일한 방법은 데이터를 긁어내어 DB에있는 데이터와 비교하는 것입니다. 매끄러운 스크래핑과 DB 코드를 작성하여 최대한 프로세스를 최적화 할 수 있습니다.

관련 문제