想要循环处理中国社会组织公共服务平台所有的年报,首先要获取所有年报的列表。我简单看了下官网的数据请求方式,主要是post每个年报对应的id来获取相关信息的,那么只要获取每一年报的id就行啦。
import requests,re,json,pymongo
from bs4 import BeautifulSoup
import multiprocessing as mp
def get_list(page):
    url  = 'http://www.chinanpo.gov.cn/bgsindex.html'
    headers = {
        'Host': 'www.chinanpo.gov.cn',
        'Origin': 'http://www.chinanpo.gov.cn',
        'Proxy-Connection': 'keep-alive',
        'Referer': 'http://www.chinanpo.gov.cn/bgsindex.html',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'
    }
    form_data = {
            'title': '',
            'websitId': '1000001',
            'page_flag': 'true',
            'goto_page': 'next',
            'current_page': page,
            'total_count': '2229'
        }
    r = requests.post(url, headers = headers, data = form_data)
    soup = BeautifulSoup(r.text, 'lxml')
    links = soup.find_all('td', align='left', valign="middle")
    for i in range(len(links)):
        piece = {
                'report_id': re.findall('[0-9]+', links[i].a.get('href'))[0],
                'diction_id': re.findall('[0-9]+', links[i].a.get('href'))[1],
                'fund_name': re.findall('(.*?)[0-9]', links[i].a.string)[0],
                'year': re.findall('[0-9]+', links[i].a.string)[0]
            }
        li.insert_one(piece)
    print('已完成{}页。'.format(page))
if __name__ == '__main__':
    myclient = pymongo.MongoClient('mongodb://localhost:27017')
    fund = myclient['fund']
    li = fund['li']
    pages = [i for i in range(0, 113)]
    p = mp.Pool()
    p.map_async(get_list, pages)
    p.close()
    p.join()
数据存储在fund数据库的li集合中,等我有空的时候拿出来继续做。
不过先得等维护结束哈。



Comments | 1 条评论
我已经对2015到2018年的项目重写了爬虫,如果有人需要的话可以私信我,或者我直接把爬下来的数据给你也行。