2016-08-14 2 views
0

현재 나는 옐프 페이지에서 레스토랑의 공식 웹 사이트 링크를 잡기 위해이 코드를 작성하고 있습니다. 코드는 대부분 작동하지만 목록을 통해 각 항목을 한 번 반환하는 대신 두 번 첫 번째 링크를 반환합니다. 나는 그것을 해결하려고 노력했지만, 나는 이것이 일어나는 원인에 막 붙어있다. 내가 잘못하고있는 것을 발견 할 수 있니?목록의 첫 번째 웹 사이트 만 실행하는 Python 3.5 스크레이퍼

또한 Yelp에서 링크를 가져 오는 것에 대해 다른 질문이 있습니다. 나는 옐프가 그것을 좋아하지 않을지도 모른다는 것을 안다. 그러나 나는 2 만 페이지의 링크를 손으로 직접 복사하여 붙여 넣을 수 없으므로 이것을 사용해야한다.

내 IP를 차단합니까? 요청간에 2 초 지연을 삽입하면 차단이 계속됩니까? 지연 삽입 외에 다른 방법이 있습니까?

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

url=[ 
"https://www.yelp.com/biz/buffalo-wild-wings-ann-arbor-3", 
"https://www.yelp.com/biz/good-burger-east-dearborn-dearborn?osq=mac+donalds" 
] 

def make_soup(url): 
    for i in url: 
     thepage=urllib.request.urlopen(i) 
     soupdata=BeautifulSoup(thepage, "html.parser") 
     return soupdata 

compoundfinal='' 
soup=make_soup(url) 

for i in url: 
    for thing1 in soup.findAll('div',{'class':'mapbox-text'}): 
     for thing2 in thing1.findAll('a',{'rel':'nofollow'}): 
      final='"http://www.'+thing2.text+'",\n' 
      compoundfinal=compoundfinal+final 

print(compoundfinal) 

답변

0

당신은 두 개의 서로 다른 루프 사이에 처리를 분할하려하지만 제대로 둘 사이에 그 위에 다시 반복 한 후 데이터를 저장하지. 또한 함수 정의에서 return 문에 잘못된 들여 쓰기가있는 것처럼 보이므로 목록의 항목 수에 관계없이 첫 번째 반복 후에 함수가 반환됩니다. 아래는 모든 처리를 하나의 기능으로 배치하여 작동하는 것 같습니다. 그것은 예제에서 작업 코드를 가져 오는 가장 좋은 방법 이었지만 문제를 해결하는 최선의 방법은 아닙니다. 한 페이지를 처리하기 위해 함수를 정의한 다음, url을 반복하여 함수를 호출하는 것이 좋습니다.

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

url=[ 
"https://www.yelp.com/biz/buffalo-wild-wings-ann-arbor-3", 
"https://www.yelp.com/biz/good-burger-east-dearborn-dearborn?osq=mac+donalds" 
] 

def make_soup(url): 
    compoundfinal = "" 
    for i in url: 
     thepage=urllib.request.urlopen(i) 
     soupdata=BeautifulSoup(thepage, "html.parser") 
     for thing1 in soupdata.findAll('div',{'class':'mapbox-text'}): 
      for thing2 in thing1.findAll('a',{'rel':'nofollow'}): 
       final='"http://www.'+thing2.text+'",\n' 
       compoundfinal=compoundfinal+final 
    return compoundfinal 


final = make_soup(url) 

print(final) 

출력

"http://www.buffalowildwings.com", 
"http://www.goodburgerrestaurant.com" 
+0

대단히 감사합니다! 이 특정 문제를 해결할 수있을뿐만 아니라이 게시물에서 많은 것을 배웠습니다. – James

1

보조 질문에 대한 답변 :

예, 긁힌 자국 사이의 지연을 두는 것은 아주 좋은 생각이 될 것입니다. 정적 인 2 초 지연으로 충분하지 않을 수도 있습니다. 아마도 2 ~ 5 사이의 무작위 지연을 고려해보십시오. 그러면 시간당 긁힌 자국을 기반으로 잡힐 수도 있지만 긁힌 자국이 덜 결정적으로 보일 것입니다. 스크립트를 작성하여 스크립트를 다시 시작할 수 있도록하는 것이 좋습니다. 스크립트가 처음부터 다시 시작하지 않으려 고하지 않을 경우에 대비하여 스크립트를 작성할 수 있습니다.

download Yell's Robots Exclusion File도 확인하십시오. 스크래핑 목록을 스크래핑되지 않은 목록과 비교하여 확인하십시오. 그들은 빙에 대해 10 초의 지연을 요구 했으므로 위에서 제안한 지연을 늘리는 것을 고려해보십시오.

이 법적 문제를 고려해 볼 수도 있습니다. 대부분의 사이트 을 긁어서 검색 엔진에 표시 할 수 있습니다. 그러나 일부 데이터 수집기는 동일한 열정을 갖지 않을 수도 있습니다. 검색 엔진에서 검색하려고하지만 경쟁자로 교체되기를 원하지 않습니다. 처음에는 데이터를 수집하는 데 많은 비용이 들며 제 3자가 무료로 타기를 거부 할 수 있습니다. 따라서 자신의 웹 사이트를 업데이트하기 위해 정기적으로이 작업을 수행하려는 경우 기술적 또는 법적 장애가 발생할 수 있습니다.

프록시를 사용하여 긁어 모으는 트래픽을 숨기고 싶은 유혹을받을 수 있지만, 잘못된 행동을한다고 생각한다는 암묵적인 메시지가 전달됩니다. 귀하의 긁힌 자국 표적은이 경우 귀하를 차단하기 위해 더 많은 노력을 할 것이며 데이터를 다시 게시하는 웹 사이트를 찾으면 귀하를 상대로 법적 조치를 취할 가능성이 더 큽니다.

+0

두 가지 가능한 문제점을 요약하고 솔루션을 제공하는 자세한 응답을 보내 주셔서 감사합니다. 계속하기 전에 Yell의 로봇 제외 파일을 살펴 보겠습니다. – James

+0

걱정 마세요 @ 제임스, 행운을 빈다! – halfer

+0

** 귀하는 또한 다른 사람들이 다음과 같은 일을하지 않을 것에 동의하며 다른 사람들을 도우미, 격려 또는 허용하지 않을 것입니다 : ** 로봇, 스파이더, 사이트 검색/검색 응용 프로그램 또는 기타 자동 장치, 프로세스 또는 수단을 사용하여 액세스, 검색, 긁기 , 또는 사이트 또는 사이트 내용의 일부분에 대한 색인을 작성; * 제한 섹션 6 iii. https://www.yelp.com/static?country=US&p=tos. 파이썬 API가 있습니다 https://github.com/Yelp/yelp-python –

관련 문제