Python 크롤러 실전 "En Jing の Study" 전체 사이트 크롤링(소스 코드 포함)
2019년 08월 18일 · 1134 · 1 min
최근에 몇 가지 새로운 리소스 스테이션을 발견했으며, 이 문제가 발생하면 약간 비윤리적이지만 내 하드 드라이브에 모든 것을 압축하는 방법을 찾을 수 있지만 인터넷에 데이터를 노출하는 한 다른 사람이 귀하의 웹사이트를 크롤링할 수 있도록 기본값을 설정하는 것과 같습니다. 그리고 그들이 상용화되지 않은 것처럼 나도 마찬가지였습니다. 이러한 데이터는 시간이 지남에 따라 결국 사라질 것이며, 사라지는 사라지는 것을 조용히 지켜보는 것보다 계속 빛나게 하는 것이 좋습니다. 최악의 경우, 나는 내 자신의 시간을내어 본사를 볼 것입니다.
이 기사의 주요 내용은 Enkyo の Shobo의 모든 전자 책과 책 표지를 크롤링하고 많은 코드가있는 해당 JSON 데이터베이스를 구축하는 것입니다. 그리고 기적적인 예언.
# 머리말
새로운 뉴스 삽입 : 글을 쓰는 시점에서 나는 여전히 궁금해하고 있었는데, 왜 오늘 작은 서점의 크롤러가 그 새 책을 다운로드하도록 강요하지 않았습니까?'(작은 서점의 웹 마스터가 하루에 5 권의 책 만 업데이트하기 때문에 매일 최신 5 권의 책을 자동으로 크롤링하여 휴대 전화로 푸시하도록 설정했습니다.) ', 나는 작은 서점에 가서 살펴 보았고, 주요 역은 이미 502입니다.
백업 스테이션도 403 up입니다.
다행스럽게도 미리 올라 갔는데, 그와 관련된 모든 웹 사이트가 조용히 슬프게 타격을 입을 것 같습니다.
그리고 제가 처음에 쓴 예언은 제가 올라간 웹사이트가 폐쇄되어 있는 한... 지연이 있지만.
[엔쿄 の書部] (https://www.enjing.com) 간단한 페이지, 매우 높은 책 품질의 페이지, 많은 잡지 및 온라인 독서를 통해 내가 만난 가장 깨끗한 전자 책 사이트입니다. 이 중 어느 것도 아무것도 아니며 가장 가치있는 것은 광고가 없다는 것입니다. (정확히는 온라인 독서 섹션에 일부 광고가 있지만 적어도 전체 화면을 가진 젊은 여성은 아닌 모든 GoogleAds입니다.)
타이포그래피도 매우 편안합니다.
Enkyo의 스터디 룸은 안티 크롤러 수단을 사용하지 않으며, 모든 링크는 CloudFlare의 CDN 가속을 사용하고 원본 서버를 숨기고, 파일 스토리지 도메인 이름은 'shudan.io'이며,이 도메인 이름은 매우 비싸 보이며, 한 문장 만 엽니 다.
흠... 조롱으로 가득 차 있습니다. 웹 마스터도 매우 흥미로운 사람이며, 인터넷에서 Enjing의 웹 마스터에 대한 정보를 찾을 수 없으며, 웹 사이트에서 찾을 수있는 후원 링크 또는 기타 연락처 정보가 없으며, 물론 저는 베테랑이며 익명 성은 꽤 제자리에 있습니다. 나는 그/그녀가 계속 숨을 수 있기를 바라고, 이 역이 더 오래 운영될 수 있기를 바랍니다.
# 크롤러 코드
# 코딩: UTF-8
#!/usr/bin/python3
OS 가져오기
수입 sys
json 가져 오기
urllib.request 가져 오기
수입 재
urllib 가져 오기
os.system('mkdir "/home/books"') #新建文件夹 다운로드한 모든 파일을 여기에서 사용할 수 있습니다.
범위 내 숫자(1,192): #一共是1909本书 또는 191페이지
print(r'페이지 %s 구문 분석' %nums)
URL = r'https://www.enjing.com/page/%s/' % nums
headers = {'사용자 에이전트': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Gecko와 같은 KHTML) Chrome/55.0.2883.87 Safari/537.36'}
요청 = urllib.request.Request(url=url, headers=headers)
해상도 = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
html=html.replace("\n", "") #剔除页面的换行符
html=html.replace("\t", "")
html=html.replace("\r", "")
link = re.findall(r'"bookmark" href="(.+?)"', html)#书每本书的链接
링크1 = str(링크)
json = re.findall(r'(.</a></p><p>+?</p>)', html)#每本书的简介
drlink = re.findall(r'https://www.enjing.com/(.+?) htm', 링크1)
drlink = str(drlink)
drlink1 = re.findall(r'\/(.+?) \.', drlink) #书的下载页面数字
zip (link, json, drlink1)의 (xqlinks, inotrs, drlinks) :
#intors 작품 소개
url = r'%s' % xqlinks# 세부 정보 페이지로 이동하여 제목, 작성자, 표지를 가져옵니다.
headers = {'User-Agent': 'Mozilla/5.0 (매킨토시; 인텔 맥 OS X x.y; rv:42.0) 도마뱀붙이/20100101 Firefox/42.0'}
요청 = urllib.request.Request(url=url, headers=headers)
해상도 = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
html=html.replace("\n", "") #剔除页面的换行符
html=html.replace("\t", "")
html=html.replace("\r", "")
bookname = re.findall(r'미리보기 후 책 설명"><h1>(.+?</h1>)', html)
bookname = str(bookname[0]) #bookname 책의 제목
저자 = re.findall(<p>r'author:(.+?)'</p>, html)
저자 = str(저자[0])#Author 저자
img = re.findall(r'210" src="https://shudan.io/(.+?)" 클래스', html)
img = str(img)#img 책의 표지
img = img.replace('[','')
img = img.replace(']','')
imgtype = img.replace('/','')
imgdownload = '/usr/bin/wget --user-agent="Mozilla/5.0" -O /home/books/'+imgtype+' https://shudan.io/'+img
os.system(imgdownload) #下载图书封面
shuming = r' 구문 분석: %s' %bookname
인쇄(슈밍)
jsons = '{"이름": "'+bookname+'","Author": "'+Author+'","intor": "'+inotrs+'","link": "your-file-server-address/home/'+bookname+'","img": "your-img-server-address/home/'+ imgtype+'"},'#这里如不需要json数据可以直接注释掉这行.
url = r'https://www.enjing.com/download.php?id=%s' % drlinks# 다운로드 페이지로 이동하여 다운로드 링크를 받으세요
headers = {'사용자 에이전트': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Gecko와 같은 KHTML) Chrome/55.0.2883.87 Safari/537.36'}
요청 = urllib.request.Request(url=url, headers=headers)
해상도 = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
html=html.replace("\n", "") #剔除页面的换行符
html=html.replace("\t", "")
html=html.replace("\r", "")
다운링크 = re.findall(r'shudan.io(.+?)" target="_blank">', html)#获取不同格式的下载链接
os.system('mkdir "/home/%s"' % bookname)#新建文件夹
다운링크의 xiazai의 경우:
geshi = xiazai[-4:]#获取文件格式, 접미사입니다. Enjing의 연구의 파일 이름을 지정하는 방법이 너무 추악하기 때문에 병음 약어를 직접 사용하기도 하는데, 이는 정말 참을 수 없습니다.
xiazailink = 'wget --user-agent="Mozilla/5.0" -O "/home/books/'+bookname+'/'+bookname+'.' +geshi+'" https://shudan.io'+xiazai
now1= '다운로드 중:'+bookname+'.' +게시
인쇄(now1)
os.system(xiazailink) #下载图书
fileObject = open('/home/books/enjing.json', 'a')#将获取到的json保存
fileObject.write(jsons)
fileObject.write('\n')
fileObject.close()를 호출합니다.
내 런타임 환경은 우분투 16.04, 파이썬 3.5입니다. Reason은 시스템에 복사하여 Python에서 직접 실행할 수 있으며, 다운로드한 책과 표지, JSON 파일은 '/home/books' 폴더에 있습니다.
각 단계의 구체적인 역할을 주석으로 달고, 필요한 경우 JSON을 생성하는 부분을 직접 삭제할 수 있습니다.
마지막으로 : * "코드가 잘못 작성되었지만 사용할 수없는 것은 아닙니다!!! "*
# 포스트 스크립트
총 1909 권의 책 [enjing-full.txt] (https://onedrive.live.com/embed?resid=5DD85E8F07B732DC!132388&filename=enjing-full.txt&authkey=!AB743xY84iFsrWQ), 총 1871 권의 책이 결국 다운로드되었으며 데이터의 약 2 %가 손실되었습니다. 그 이유는 누락된 책 제목 부분에 "/" 슬래시 기호가 포함되어 있어 크롤러 스크립트가 폴더를 생성하지 못하고 후속 다운로드가 실패하기 때문입니다. 이 2 %를 위해 다시 다운로드 할 계획도 없습니다. (시간이 있을 때 트래버스를 되돌리고 슬래시로 다운로드를 필터링하여 그때까지 Enjing이 사이트를 닫지 않기를 바랍니다.)'
JSON 데이터는 1908개의 복사본으로 크롤링되었습니다. 다운로드 데이터와 크롤링 "작성자, 소개, 표지"가 분리되어 있기 때문에 JSON 데이터가 조금 더 꽉 찼습니다.
손실된 데이터 중 일부는 wget 오류를 유발하는 네트워크 문제로 인해 다운로드 오류가 발생합니다.
성취:
*평균 다운로드 속도는 약 0.7M/s, 각 책은 약 10.9M, 분당 약 3.9권의 책 다운로드는 총 8시간이 소요됩니다. *
팁: 이 유형의 다운로드 크롤러는 원본 서버에 미치는 영향을 줄이기 위해 야간에 실행하는 것이 좋으며 결국 야간 방문 횟수가 적습니다. 웹마스터도 자고 있습니다.