zhaohz
# coding: utf-8

import datetime
import urllib.parse
import urllib.request
from urllib.error import *
from bs4 import BeautifulSoup
import re
import os


def get_html(url, values):
    html = \'\'
    status_code = 200
    user_agent = \'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36\'
    headers = {\'User-Agent\': user_agent}
    data = urllib.parse.urlencode(values).encode(encoding=\'UTF8\')
    for i in range(1,3):
        req = urllib.request.Request(url=url, headers=headers, data=data)
        try:
            response = urllib.request.urlopen(req)
        except HTTPError as e:
            print(url, values)
            print(\'The server couldn\\'t fulfill the request.\')
            print(\'HTTP Error,code: \', e.code)
            status_code = int(e.code)
            break
        except URLError as e:
            status_code = int(e.code)
            print(\'We failed to reach a server.Reason: \', e.reason)
            print(\'url: %s, status code:%d, retry count:%d\' % (url + \'?\' + bytes.decode(data), status_code, i))
        else:
            html = response.read( ).decode(\'gbk\')
            break

    return html, status_code


def request_page(page):
    url = \'http://cmispub.cicpa.org.cn/cicpa2_web/PersonIndexAction.do\'
    values = {
        \'method\': \'indexQuery\',
        \'queryType\': \'2\',
        \'isStock\': \'00\',
        \'pageSize\': \'\',
        \'pageNum\': page,
        \'offName\': \'\',
        \'ascGuid\': \'\',
        \'perCode\': 0,
        \'perName\': \'\'
    }
    return get_html(url, values)


def parse_cicpa_page(html):
    soup = BeautifulSoup(html, \'html.parser\')
    items = soup.select("#tabDetail a")
    return items


def request_detail(code):
    print(\'request code:\', code)
    url = \'http://cmispub.cicpa.org.cn/cicpa2_web/07/\' + code + \'.shtml\'
    values = {}
    return get_html(url, values)


def parse_detail_header(html):
    soup = BeautifulSoup(html, \'html.parser\')
    headers = soup.select("#detailtb td.tdl")
    line = \'\'
    for item in headers:
        line = line + item.get_text( ).strip( ) + \',\'
    line = line.strip(\',\')
    return line


def parse_detail_content(html):
    soup = BeautifulSoup(html, \'html.parser\')
    headers = soup.select("#detailtb td.data_tb_content")
    line = \'\'
    for item in headers:
        line = line + item.get_text( ).strip( ) + \',\'
    line = line.strip(\',\')
    return line


def create_file(filepath, header):
    file_dir = os.path.split(filepath)[0]
    if not os.path.isdir(file_dir):
        os.makedirs(file_dir)
    if not os.path.exists(filepath):
        f = open(filepath, \'w\')
        if len(header) > 0:
            f.write(header + \'\n\')
        f.close( )


def is_down_exists(code):
    return False


def main():
    start_time = datetime.datetime.now( )

    html_dir = \'D:/crawl_data/cicpa/html/\'
    if not os.path.isdir(html_dir):
        os.makedirs(html_dir)

    header_file = \'D:/crawl_data/cicpa/header.csv\'
    need_header = not os.path.exists(header_file)

    datafile = \'D:/crawl_data/cicpa/data_%s.csv\' % start_time.strftime("%Y%m%d_%H%M%S_%f")
    page_error_file = \'D:/crawl_data/cicpa/error_page_%s.txt\' % start_time.strftime("%Y%m%d_%H%M%S_%f")
    detail_error_file = \'D:/crawl_data/cicpa/error_detail_%s.txt\' % start_time.strftime("%Y%m%d_%H%M%S_%f")

    create_file(datafile, \'\')
    create_file(page_error_file, \'page,status\')
    create_file(detail_error_file, \'code,status\')

    data_file_object = open(datafile, \'+w\')
    page_error_file_object = open(page_error_file, \'+w\')
    detail_error_file_object = open(detail_error_file, \'+w\')

    for i in range(1, 6912):
        print(\'request:\', i)
        result, status = request_page(i)
        if status != 200:
            page_error_file_object.write(str(i) + \',\' + str(status) + \'\n\')
            page_error_file_object.flush( )
            continue
        items = parse_cicpa_page(result)
        for item in items:
            code = re.findall(r"javascript:viewDetail\(\\'(\w+?)\\',", str(item))[0]
            html_file_path = html_dir + code + \'.html\'
            if os.path.exists(html_file_path):
                continue
            detail_html, status = request_detail(code)
            if len(detail_html) == 0:
                detail_error_file_object.write(code + \',%d\n\' % status)
                detail_error_file_object.flush( )
                continue
            if need_header:
                header = parse_detail_header(detail_html)
                f = open(header_file, \'w\')
                f.write(header + \'\n\')
                f.close()
                need_header = False
            # save base data
            line = parse_detail_content(detail_html)
            data_file_object.write(line + \'\n\')
            data_file_object.flush( )
            # save html
            html_file_object = open(html_file_path, \'w\')
            html_file_object.write(detail_html + \'\n\')
            html_file_object.close( )
            print(line)

    data_file_object.close( )
    page_error_file_object.close( )
    detail_error_file_object.close( )
    print(\'finished in\', (datetime.datetime.now( ) - start_time).microseconds, \'ms\')

if __name__ == \'__main__\':
    main( )

 

 

分类:

技术点:

相关文章:

  • 2022-01-19
  • 2022-02-07
  • 2022-02-22
  • 2021-11-18
  • 2021-11-24
  • 2022-02-23
  • 2021-12-27
  • 2021-10-05
猜你喜欢
  • 2021-12-29
  • 2022-02-05
  • 2021-11-29
  • 2022-01-21
  • 2022-02-21
  • 2021-12-09
  • 2021-12-05
相关资源
相似解决方案