장고와 함께하는 파이썬 웹 프로그래밍 책 pg 330 예제 참고 함
import requests
from bs4 import BeautifulSoup
def parse_image(data):
soup = BeautifulSoup(data, 'html.parser')
imgTagList = soup.find_all('img')
dataSet = set(x.attrs['src'] for x in imgTagList)
return dataSet
def main():
url = "http://www.google.co.kr"
res = requests.get(url)
charset = res.encoding
data = res.content.decode(charset)
dataSet = parse_image(data)
print("\n>>> Fetch images from", url)
print('\n'.join(sorted(dataSet)))
if __name__ == '__main__':
main()
결과
>>> Fetch images from http://www.google.co.kr
/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png
/textinputassistant/tia.png
다른 쉬운 코드로 먼저 참고하면
import re
from urllib import urlopen
from bs4 import BeautifulSoup
soup = BeautifulSoup(urlopen("https://en.wikipedia.org/wiki/Kevin_Bacon"), "html.parser")
for link in soup.findAll("a"):
print link
soup = BeautifulSoup( urlopen(url), "html.parser") 은 requests(re) 라이브러리에서 웹 요청을 받은 데이터의 html을 스크롤 해준다.
아까 적용한 변수 soup에 함수 findall를 사용하여 <a>라는 태그를 모두 가져와서 리스트를 구성하고 for문을 돌려 하나하나 프린트하게 한다.
def parse_image(data):
soup = BeautifulSoup(data, 'html.parser')
imgTagList = soup.find_all('img')
dataSet = set(x.attrs['src'] for x in imgTagList)
return dataSet
처음 코드의 첫번째 부분인 parse_image(data)에서는 data라는 url을 메인 함수에서 받아오기때문에 아까와 같은 구조인 soup 변수가 만들어진다.
soup = BeautifulSoup(data, "html.parser")
다음으로 imgTagList에는 리스트를 저장한다. 아까는 <a>태그 였다면 여기는 img태그를 찾는다.
imgTagList = soup.find_all('img')
import re
from urllib import urlopen
from bs4 import BeautifulSoup
soup = BeautifulSoup(urlopen("https://en.wikipedia.org/wiki/Kevin_Bacon"), "html.parser")
for link in soup.findAll("a"):
if 'href' in link.attrs: # 내부에 있는 항목들을 리스트로 가져옵니다 ex) {u'href': u'//www.wikimediafoundation.org/'}
print (link.attrs['href'])
또 다른 코드를 참고해서 attrs기능에 대해 알아보자.
attrs는 <
<a href="/wiki/Edmund_Bacon_(architect)" title="Edmund Bacon (architect)">Edmund Bacon</a>
<a href="/wiki/Michael_Bacon_(musician)" title="Michael Bacon (musician)">Michael Bacon</a>
...
같이 <a>태그 안에 있는 href와 title, text를 리스트로 만들고 href만 골라오는 기능을 한다.
def parse_image(data):
soup = BeautifulSoup(data, 'html.parser')
imgTagList = soup.find_all('img')
dataSet = set(x.attrs['src'] for x in imgTagList)
return dataSet
따라서 세번째 변수 dataSet을 만들때 x.attrs는 imgTaglist의 요소인 x에서 src가 있는 애를 또 따로 가져와 set자료형으로 만든 것이다.
for x in imgTaglist :
dataSet = set(x.attrs['src'])
이나 마찬가지이다.
<img class="gb_La gbii" src="https://lh3.googleusercontent.com/ogw/ADGmqu_9a0jGzL_nQ8X4OqI8X17RQaKz2gedxxjnq_Q0=s32-c-mo" srcset="https://lh3.googleusercontent.com/ogw/ADGmqu_9a0jGzL_nQ8X4OqI8X17RQaKz2gedxxjnq_Q0=s32-c-mo 1x, https://lh3.googleusercontent.com/ogw/ADGmqu_9a0jGzL_nQ8X4OqI8X17RQaKz2gedxxjnq_Q0=s64-c-mo 2x " alt="" aria-hidden="true" data-noaft="" data-iml="1599380160979" data-atf="1">
img 태그 안에 있는 src = 을 가져와서 set으로 만든다.
def main():
url = "http://www.google.co.kr"
res = requests.get(url)
charset = res.encoding
data = res.content.decode(charset)
dataSet = parse_image(data)
print("\n>>> Fetch images from", url)
print('\n'.join(sorted(dataSet)))
다음 코드는 main()함수다.
url 을 설정하고
res = requests.get(url)로 서버에 요청한다.
res.status_code 를 치면 200이라고 정상 작동 신호를, res.text를 확인하면 html문서파일 전체가 나온다.
res = requests.get(url)
웹브라우져에서 티스토리를 접속한 것과 똑같은 이야기이다. www.tistory.com 이라는 주소로 GET 요청(request)를 보냈고 서버에서는 그 요청을 받아 뭔가를 처리한 후 요청자인 나에게 응답(response)를 줬다. 우선 그 응답은 200 상태코드와 함께 왔다. 이는 티스토리 서버에서 잘 처리되어서 정상적인 응답을 보내줬다는 OK 싸인을 의미한다. 그리고 응답의 내용은? 보시다시피 HTML 코드.
출처: https://dgkim5360.tistory.com/entry/python-requests [개발새발로그]
다음 코드인 charset = res.encoding을 확인하면
Response Content
>>> r = requests.get('https://api.github.com/events')
>>> r.text # 텍스트 형식으로 내용 출력
>>> r.encoding # 인코딩 확인
'utf-8'
>>> r.encoding = 'ISO-8859-1' # 인코딩
즉 utf -8 인지 등 인코딩을 확인해준다.
문자 인코딩영어: character encoding), 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다. 위키백과
def main():
url = "http://www.google.co.kr"
res = requests.get(url)
charset = res.encoding
print(res)
print(charset)
print(res.content)
#data = res.content.decode(charset)
#dataSet = parse_image(res)
print("\n>>> Fetch images from", url)
#print('\n'.join(sorted(dataSet)))
res
charset
res.content
내용 확인하려고 print()구문 썼더니
res = Response[200]
charset = EUC-KR
res.content = html 전체
디코딩 왜 하는거지?
해서
dataSet = parse_image(res.content)
로 바꿔봤는데 엥 디코딩 안해도 잘 나온다.
import requests
from bs4 import BeautifulSoup
def parse_image(data):
soup = BeautifulSoup(data, 'html.parser')
imgTagList = soup.find_all('img')
dataSet = set(x.attrs['src'] for x in imgTagList)
return dataSet
def main():
url = "http://www.google.co.kr"
res = requests.get(url)
charset = res.encoding
data = res.content.decode(charset)
dataSet = parse_image(data)
print("\n>>> Fetch images from", url)
print('\n'.join(sorted(dataSet)))
if __name__ == '__main__':
main()
'파이썬' 카테고리의 다른 글
간단 wsgi server 까지 (0) | 2020.09.12 |
---|---|
my_HTTPServer / python -m http.server 8888/ cgi 서버 (0) | 2020.09.12 |
http.client 모듈 예제 download-image from google (0) | 2020.09.10 |
파이썬 urlopen()함수 예제 - Request 클래스로 요청 헤더 지정 (0) | 2020.09.10 |
홍련화 가사 html for li in lis with xpath (0) | 2020.08.29 |
파이썬 네이버 블로그 크롤링 더 깔끔한 코드! (0) | 2020.08.26 |
python 이용한 네이버 블로그 탑 100개 웹 크롤링 - .format(page) (0) | 2020.08.26 |
파이썬 웹크롤링 연습 : 알고리즘 기초 사이트 : get text (0) | 2020.08.24 |