Python 多进程爬虫实例

时间:2021-07-29 03:49:34

Python  多进程爬虫实例

 

import json
import re
import time
from multiprocessing import Pool
import requests
from requests.exceptions import RequestException
from bs4 import BeautifulSoup


def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


def parse_one_page(html):
    data_list = []
    soup = BeautifulSoup(html, "lxml")
    index_list = soup.select('i.board-index')
    img_list = [x['data-src'] for x in soup.findAll('img', {'class': 'board-img'})]
    name_list = soup.select('p.name')
    actor_list = soup.select('p.star')
    time_list = soup.select('p.releasetime')
    score_list = soup.select('p.score')
    for i in range(len(index_list)):
        data_list.append({
            'index': index_list[i].get_text(),
            'image': img_list[i],
            'title': name_list[i].get_text(),
            'actor': actor_list[i].get_text().strip(),
            'time': time_list[i].get_text(),
            'score': score_list[i].get_text()
        })
    return data_list


def write_to_file(content):
    with open('resul1t.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
        f.close()


def main(offset_list):
    for offset in offset_list:
        url = 'http://maoyan.com/board/4?offset=' + str(offset)
        html = get_one_page(url)
        if html:
            for item in parse_one_page(html):
                write_to_file(item)


if __name__ == '__main__':
    # pool = Pool()
    # pool.map(main, [i * 10 for i in range(10)])
    # pool.close()
    # pool.join()
    # main(1)


    offset_list = list(range(0, 100, 10))  # 多进程
    p = Pool()
    for index in range(5):
        p.apply_async(main, args=(offset_list[index * 2:(index + 1) * 2],))

    p.close()
    p.join()