Python 파충류 포럼 키워드 캡 처 과정 분석

선언:
이전에 python 파충류 의 기본 지식 을 배 웠 는데,지금 은 파충류 로 실제 데이터 통계 기능 을 할 계획 이다.얼마 전 배우 의 탄생 으로 젊 은 실력 파 배우 몇 명 이 불 을 붙 였 기 때문에 파충류 프로그램 으로 한 포럼 에서 어떤 배우 에 대한 토론 열 기 를 검색 하고 날짜 에 따라 매일 토론 량 을 집계 하려 고 했다.
이 항목 은 모두 두 단계 로 나 뉜 다.
1.모든 댓 글 의 링크 가 져 오기:
최근 한 달 간 의 게시 물 링크 를 배열 에 저장 합 니 다.
2.댓 글 에서 배우 이름 찾기:
배열 에서 링크 를 열 고 이 링크 의 모든 댓 글 을 꺼 내 댓 글 에서 배우 의 이름 을 찾 습 니 다.
모든 댓 글 의 링크 가 져 오기:
검색 범 위 는 여전히 호랑이 가 영화 와 드라마 를 덮 치 는 것 을 경계 로 한다.호 포 영화 구 는 하루 에 약 5000 개의 댓 글 을 달 고 1 월 에 15 만 개가 넘 는 댓 글 을 달 아 샘플 로 도 작 지 않 아 참고 가치 가 있다.
이 절 차 를 완성 하면 주로 다음 과 같은 몇 단계 로 나 뉜 다.
1.현재 날짜 가 져 오기
2.30 일 전 날짜 가 져 오기
3.첫 페이지 에서 뒤로 넘 긴 모든 댓 글 링크 기록
1.현재 날짜 가 져 오기
여기 서 우 리 는 datetime 모듈 을 사용 했다.datetime.datetime.now()를 사용 하면 현재 날짜 정보 와 시간 정 보 를 얻 을 수 있 습 니 다.이 항목 에 서 는 날짜 정보 만 사용 하면 됩 니 다.
2.30 일 전 날짜 가 져 오기
datetime 모듈 을 사용 하 는 장점 은 시간 차 를 스스로 계산 할 수 있 는 좋 은 함수 가 있다 는 것 이다.주어진 매개 변수 days=30 시 30 일의 시간 차 가 생 성 되 고 현재 날짜 로 dela 를 빼 면 30 일 전의 날 짜 를 얻 을 수 있 으 며 이 날 짜 를 startday 로 저장 하면 통 계 를 시작 하 는 날짜 입 니 다.그렇지 않 으 면 시간 차 를 계산 하려 면 윤년 을 뛰 어 넘 는 등 요 소 를 스스로 고려 해 야 비교적 복잡 한 함 수 를 통 해 완성 할 수 있다.
today = datetime.datetime.now()
delta = datetime.timedelta(days=30)
i = "%s" %(today - delta)
startday = i.split(' ')[0]
today = "%s" %today
today = today.split(' ')[0]
시작 날짜 와 종료 날 짜 를 얻 은 후에 도 매일 모든 사람의 토론 수 를 기록 해 야 하기 때문에 이 두 날짜 에 따라 두 개의 사전 을 생 성 합 니 다.각각 actor 1 입 니 다.dict 와 actor 2dict。사전 은 날 짜 를 키 로 하고 당일 토론 수 를 value 로 하여 검색 기록 을 추가 할 때마다 해당 하 는 value 값 을 업데이트 할 수 있 습 니 다.
strptime, strftime = datetime.datetime.strptime, datetime.datetime.strftime
days = (strptime(today, "%Y-%m-%d") - strptime(startday, "%Y-%m-%d")).days
for i in range(days+1):
temp = strftime(strptime(startday, "%Y-%m-%d") + datetime.timedelta(i), "%Y-%m-%d")
actor1_dict[temp] = 0
actor2_dict[temp] = 0
3.첫 페이지 에서 뒤로 넘 긴 모든 댓 글 링크 기록

그림 1 에서 보 듯 이 댓 글 순 으로 배열 하면 모든 댓 글 시간(분 까지 정확)을 얻 을 수 있다.오른쪽 단 추 를 누 르 고 웹 페이지 소스 코드 를 보면 현재 게시 물의 링크 페이지 를 발견 하고 정규 표현 식 으로 링크 를 캡 처 할 수 있 습 니 다.
우선 30 일 전의 날 짜 를 가 져 오고 i 페이지 의 소스 코드 를 캡 처 하여 정규 표현 식 으로 일치 시 켜 웹 링크 와 댓 글 시간 을 가 져 옵 니 다.그림 2 참조:

게시 시간 을 비교 합 니 다.30 일 전 날짜 보다 적 으 면 게시 물 링크 가 끝나 고 현재 받 은 링크 배열 로 돌아 갑 니 다.코드 는 다음 과 같 습 니 다.

def all_movie_post(ori_url):
  i = datetime.datetime.now()
  delta = datetime.timedelta(days=30)
  i = "%s" %(i - delta)
  day = i.split(' ')[0] #   30     
  print day
 
  user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
  headers = { 'User-Agent' : user_agent }
 
  post_list = []
  for i in range(1,100):
    request = urllib2.Request(ori_url + '-{}'.format(i),headers = headers)
    response = urllib2.urlopen(request)
    content = response.read().decode('utf-8')
    pattern = re.compile('<a href="(.*?)" rel="external nofollow" class="truetit" >.*?<a style="color:#808080;cursor: initial; ">(.*?)</a>', re.S)
    items = re.findall(pattern,content)
    for item in items:
      if item[1] == '2011-09-16':
        continue
      if item[1] > day: #   30     ,  
        post_list.append('https://bbs.hupu.com' + item[0])
      else: #      30  ,     
        return post_list
  return post_list
함수 의 전 참 은 첫 페이지 를 연결 하고 함수 에서 페이지 번 호 를 수정 하 며 계속 검색 합 니 다.
댓 글 에서 배우 이름 검색:
다음 절차 도 하나의 함 수 를 통 해 해결 된다.함수 의 전 참 은 이전 단계 에서 얻 은 링크 배열 을 포함 하고 이미 조회 하고 싶 은 배우 이름(이 기능 은 더욱 확장 할 수 있 고 배우 이름 도 목록 으로 전송 할 수 있 으 며 이전 단계 에 생 성 된 사전 도 많 을 수 있 습 니 다)을 포함 합 니 다.
호 포 포럼 은 인 정 받 은 댓 글 을 앞 에 놓 고 반복 하기 때문이다.그림 3 참조:

중복 통 계 를 피하 기 위해 이 중복 을 먼저 제거 합 니 다.코드 는 다음 과 같 습 니 다.

if i == 0:
        index = content.find('       ')
        if index >= 0:
          content = content[index:]
        else:
          index = content.find('    ')
          content = content[index:]
제 거 된 규칙 은 사실 중요 하지 않다.모든 포럼 은 자신의 형식 이 있 기 때문에 소스 코드 에 어떻게 쓰 여 있 는 지 알 수 있 으 면 나머지 조작 은 스스로 규칙 에 따라 진행 할 수 있다.
각 댓 글 형식 은 대체로 그림 4 와 같다.

대응 하 는 정규 표현 식 으로 일치 합 니 다.모든 댓 글 의 내용 을 찾 아 내용 에서 배우 이름,즉 처음부터 actor 를 검색 합 니 다.1 과 actor2.찾 으 면 해당 댓 글 날짜 에+1.
결국 두 배우 의 이름 을 주파수 로 되 돌려 주 고 날짜 에 따라 기 록 된 사전 은 전역 변수 이기 때문에 되 돌아 올 필요 가 없다.

web_str = '<span class="stime">(.*?) .*?</span>.*?<tbody>[\s]*<tr>[\s]*<td>(.*?)<br />' #         
      pattern = re.compile(web_str, re.S)
      items = re.findall(pattern,content)
      for item in items:
        #if '<b>  ' in item: #         ,       
          #try:
            #item = item.split('</blockquote>')[1]
          #except:
            #print item
            #print item.decode('utf-8')
        if actor_1 in item[1]:
          actor1_dict[item[0]] += 1
          actor_1_freq += 1
        if actor_2 in item[1]:
          actor2_dict[item[0]] += 1
          actor_2_freq += 1
이로써 우 리 는 파충류 지식 을 이용 해 포럼 키워드 에 대한 빈도 검색 을 성공 적 으로 마 쳤 다.
이것 은 하나의 예 일 뿐 키 워드 는 마음대로 할 수 있다.이것 은 배우 의 탄생 을 겨냥 한 프로그램 이 아니다.배우 이름 을 다른 단어 로 바 꾸 면'올해 의 키워드'와 같은 결 과 를 얻 을 수 있 고 주파수 크기 에 따라 문자 크기 를 나 타 낼 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기