<python> 네이버, 구글 자동검색하는 코드, 블락(?)될 떄

koreaccm의 이미지

부끄럽지만;;; 이해를 돕기위해 코드를 바로 적겠습니다.
아래와 같이
네이버나 구글 검색 URI에 매개변수를 더해서
검색자동화를 시켜보려고 합니다.
그런데 네이버든 구글의 통합검색 URI로 해보니 모두 검색차단을 하고 있네요.
이유는 알겠는데, 해결방법을 어디서부터 찾아야할지 모르겠습니다.

API를 통해서만 가능한 것일까요?
아니면 http header 부분에 있어야할 (user-agent, e-tag 등등 이런 값이 없어서 그런걸가요?)
질문이 바보 같더라도 현답 부탁드립니다.
왕뉴비 올림

#-*-encoding: cp949 -*-
import urllib

f = urllib.urlopen("http://search.naver.com/search.naver?query="+"한예슬".encode("utf-8"))
cont = f.read().decode("utf-8")
print cont

snowall의 이미지

제 추측에는 user-agent 문제 같아 보이는데요..

피할 수 있을때 즐겨라! http://melotopia.net/b

bushi의 이미지

여러가지가 되어야 하나봅니다.
하나씩 추가하면서 살펴볼 수 밖에요.

$ w3m -dump_source <a href="http://search.naver.com/search.naver?query=한예슬" rel="nofollow">http://search.naver.com/search.naver?query=한예슬</a> | gunzip -d > x
Received cookie: page_uid=Rb01x35Y7udsssO871dssc--377677
Received cookie: _naver_usersession_=UG01x1ImbVAAAAd8Fsw
 
$ file x
x: HTML document text
 
$ rm x
$ w3m -dump_source -no-cookie -reqlog <a href="http://search.naver.com/search.naver?query=한예슬" rel="nofollow">http://search.naver.com/search.naver?query=한예슬</a> | gunzip -d > x
 
$ file x
x: HTML document text
 
 
$ w3m -F -T text/html -dump x | grep 한예슬
        갑자기 보고싶다ㅠㅠ 송중기랑 한예슬이 나온 영화 한번 더 보고싶다 송중기
...
...
    '컴백' 동방신기 "외모 이상형, 한예슬·전지현"(인터뷰②)
...
...
        그건 안봤어 ㅠ 한예슬 나와거 ㅠㅜ 한예슬 화이팅 예금보험공사제목알려
 
 
$ cat ~/.w3m/request.log
GET /search.naver?query=%ED%95%9C%EC%98%88%EC%8A%AC HTTP/1.0
User-Agent: w3m/0.5.2
Accept: text/html, text/*;q=0.5, image/*, application/*, audio/*, multipart/*
Accept-Encoding: gzip, compress, bzip, bzip2, deflate
Accept-Language: en;q=1.0
Host: search.naver.com
 
HTTP/1.1 200 OK
Date: Thu, 04 Oct 2012 07:23:53 GMT
Server: Apache
Set-Cookie: page_uid=Rb0HAU5Y7uhssu9rK6Kssc--215587; path=/; domain=.naver.com
Set-Cookie: _naver_usersession_=UG05iV8mbVAAAC9rEms; path=/; expires=Thu, 04-Oct-12 07:28:53 GMT; domain=.naver.com
X-Frame-Options: SAMEORIGIN
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
P3P: CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"
Connection: close
Content-Type: text/html; charset=UTF-8
bushi의 이미지

wget 으로 하나씩 시험해봤는데... accept-encoding 에 gzip 이 들어있는 client 만 허용하네요.

$ wget --header="accept-encoding: gzip" -O - search.naver.com/search.naver?query=%ED%95%9C%EC%98%88%EC%8A%AC | gunzip -d > x
 
$ file x
x: HTML document text
 
$ w3m -F -T text/html -dump x | grep 한예슬
...
...

헤더에 포함시키시고, 받은 놈은 zlib 으로 풀어서 해석하셔야겠습니다.

koreaccm의 이미지

정말 감사합니다.

최소한의 실마리를 찾아주셨네요. 제가 실력이 너무 없어서 며칠 걸리겠지만
꼭 테스트 마치는 대로 다시 감사인사드리겠습니다.
감사합니다.

koreaccm의 이미지

#-*- encoding: cp949 -*-
import httplib, urllib, urllib2
import StringIO, gzip

httplib.HTTPConnection.debuglevel = 1
query_args = {'query':'house'}
encoded_args = 'search.naver?'+ urllib.urlencode(query_args)

request = urllib2.Request('http://searchc.naver.com/')
request.add_header('User-agent', 'Mozilla/5.0')
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request, encoded_args)

compressedstream = StringIO.StringIO(response.read())
gzipper = gzip.GzipFile(fileobj=compressedstream)

print gzipper.read()

일단 이렇게 했더니 출력되고 있습니다.
문자열 인코딩/디코딩 개념이 제대로 안 서 있어서... 아무리 해봐도 한글은 깨지고 있네요.
그래서 이 결과값이
"네이버 첫화면" 인지 "네이버 검색결과"인지는 아직 모르겠습니다.

처음 질문 올렸을 때보다 장족의 발전입니다. 작은 코멘트 하나로 여기까지 왔습니다.
두 분 모두 감사드립니다

qiiiiiiiip의 이미지

올려주신 내용 그대로 스크립트 만들어서,
아래와 같이 수행했습니다.

$ python test.py > out.txt

한글 문제없이 잘 보이네요.. utf8로 인코딩되어있습니다.
일단 위와 같이 파일로 받으시고
vi 등으로 인코딩 자동 인식해서 열어보시면 잘 보이실듯..
터미널이 인코딩도 주의하시고요.

$ head out.txt
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ko" xml:lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=880" />
<link rel="shortcut icon" type="image/x-icon" href="http://static.naver.net/www/favicon.ico" />
<title>네이버 :: 나의 경쟁력, 네이버</title>
koreaccm의 이미지

감사합니다. qiiiiiiiip님

그런데 저도 이제 확인해보니
기대와는 다른 결과값이 반환되는 것 같습니다.
query에 대한 검색결과가 아니라 그냥 네이버홈이더라구요.

eunchul의 이미지

이전에 비슷한 경험이 있어서 공유합니다.
저는 네이버 이미지 검색을 통해 이미지 경로좀 긁어보려고 했었는데요..
header 에 'Accept' 가 포함되어있어야 검색결과가 나왔었습니다.

#encoding:utf-8
import urllib.request
 
req = urllib.request.Request('http://image.search.naver.com/search.naver?where=image&sm=tab_jum&ie=utf8&query=%EC%9D%B4%EC%A4%80')
req.add_header('User-agent', 'Mozilla/5.0')
req.add_header('Accept', 'text/html')
 
res = urllib.request.urlopen(req)
text = res.read().decode("utf8")
 
print(text)

python3에서 동작했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.