1. 필요한 첫 번째 줄 링크 크롤링
channel_extract.py
여기서 첫 번째 줄 링크는 주요 링크 카테고리라고 합니다.
channel_extract.py p>
from bs4 import BeautifulSoupimport 요청
start_url = '/wu/'host_url = '/' def get_channel_urls(url):
wb_data = 요청.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
links = 수프.select('.fenlei > dt > a') #print(links)
링크의 링크:
page_url = host_url + link.get('href')
print(page_url)#get_channel_urls( start_url)channel_urls = ''' p>
/jiaju/
/rirongbaihuo/
/shouji/
/bangong/
/nongyongpin/ p>
/jiadian/
/ershoubijibendiannao/
/ruanjiantushu/
/yingyouyunfu/
/diannao/ p>
/xianzhilipin/
/fushixiaobaxuemao/
/meironghuazhuang/
/shuma/
/laonianyongpin/ p>
/xuniwupin/
''123456789101112131415161718192021222324252627282930313233343536
그러므로 제가 크롤링한 58개 도시를 예로 들어 링크를 크롤링했습니다. 중고시장의 모든 카테고리 중, 바로 나
이러한 링크의 고유한 특징을 찾아 출력하는 기능을 이용하여 멀티라인으로 저장합니다. 텍스트.
2. 필요한 세부 페이지의 링크와 세부 정보를 가져옵니다.
page_parsing.py
1. 데이터베이스에 대해 이야기해 보겠습니다.
먼저 코드를 살펴보세요:
#bs4에서 라이브러리 파일 가져오기 import BeautifulSoupimport presentsimport pymongo #Python은 MongoDB 라이브러리를 작동합니다 import reimport time#Link 및 데이터베이스 설정 클라이언트 = pymongo.MongoClient('localhost', 27017 )
ceshi = client['ceshi'] #ceshi 데이터베이스 구축 ganji_url_list = ceshi['ganji_url_list'] #테이블 파일 생성 ganji_url_info = ceshi['ganji_url_info']123456789101112
2. 판단 페이지 구조가 우리가 원하는 페이지 구조와 일치하는지, 예를 들어 404 페이지가 나올 때도 있습니다;
3. 페이지에서 원하는 링크, 즉 각 상세 페이지에 대한 링크를 추출합니다. ;
여기서 우리가 이야기할 것은 메소드에 관한 것입니다:
item_link = link.get('href').split('?')[0]12 p>
여기 이 링크는 어떤 유형이고, 이 get 메서드는 무엇인가요?
나중에 이 유형이
특정 속성을 개별적으로 얻으려면 예를 들어, 클래스를 얻을 때 클래스 이름은 무엇입니까?
print Soup.p['class']
#['title']12 p>
이 작업도 수행할 수 있습니다. get 메소드를 사용하여 속성 이름을 전달하세요. 둘은 동일합니다.
print Soup.p.get('class')#['title ']12
다음 코드를 붙여넣습니다.
#모든 제품 세부정보 페이지 링크를 크롤링합니다. def get_type_links(channel, num):
list_view = ' {0}o{1}/'.format(channel, str(num)) #print(list_view)
wb_data = 요청.get(list_view)
soup = BeautifulSoup( wb_data.text, 'lxml') p>
linkOn = Soup.select('.pageBox') #필요한 페이지의 플래그인지 확인합니다.
#선택한 경우 아래로 내려간 링크는 다음과 같습니다: div.pageBox > ul > li:nth-child(1) > a >span 여기서:nth-child(1)는 삭제되어야 합니다
#print(linkOn) p>
linkOn인 경우:
link = 수프.select('.zz > .zz-til > a')
link_2 = 수프.select('.js- item > a')
link = link + link_2 #print(len(link))
for linkc in link:
linkc = linkc.get( 'href')
ganji_url_list .insert_one({'url': linkc})
print(linkc) else: pass1234567891011121314151617181920
4. 세부정보 페이지에서 필요한 정보를 크롤링합니다.
코드를 게시하겠습니다.
# Ganji 웹사이트 세부정보 페이지 링크 크롤링: def get_url_info_ganji(url):
time.sleep(1)
wb_data = 요청.get(url)
수프 = BeautifulSoup(wb_data.text, 'lxml') 시도:
title = 수프.select('head > title')[0].text
timec = 수프.선택 ( '.pr-5')[0].text.strip()
type = 수프.select('.det-infor > li > 스팬 > a')[0].text p >
가격 = 수프.select('.det-infor > li > i')[0].text
place = 수프.select('.det-infor > li > a' ) [1:]
placeb = [] for placec in place:
placeb.append(placec.text)
tag = 수프.select(' . second-dt-bewrite > ul > li')[0].text
tag = ''.join(tag.split()) #print(time.split())
data = { 'url' : url, 'title' : 제목, 'time' : timec.split(), 'type' : 유형, 'price' : 가격, 'place' : placeb, 'new' : 태그
}
ganji_url_info.insert_one(data) # 데이터베이스에 데이터 조각 삽입;
print(data) 제외 IndexError: pass123456789101112131415161718192021222324252627282930
4. 주요 기능을 작성하는 방법은 무엇입니까?
main.py
코드 보기:
#먼저 다른 파일의 함수와 데이터를 소개합니다: from multiprocessing import Poolfrom page_parsing import get_type_links,get_url_info_ganji,ganji_url_listfrom Channel_extract import Channel_urls#모든 링크를 크롤링하는 함수: def get_all_links_from(channel):
for i in range(1,100):
get_type_links(channel,i)#그런 다음 이 함수를 실행합니다. 모든 세부정보 페이지를 크롤링하는 데 사용됩니다. if __name__ == '__ma
in__':# pool = Pool()# # pool = Pool()# pool.map(get_url_info_ganji, [url['url'] for url in ganji_url_list.find()])# pool.close()# pool.join ()#먼저 다음 함수를 실행하여 모든 링크를 크롤링합니다: if __name__ == '__main__':
pool = Pool()
pool = Pool()
pool.map(get_all_links_from,channel_urls.split())
pool.close()
pool.join()1234567891011121314151617181920212223242526
5.
count.py
크롤링된 데이터 수를 표시하는 데 사용됩니다.
import timefrom page_parsing import ganji_url_list,ganji_url_infowhile True: # print( ganji_url_list.find() .count())
# time.sleep(5)
print(ganji_url_info.find().count())
time.sleep(5 )