爬虫模板1

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import re
from time import sleep
from multiprocessing import Pool
from multiprocessing import freeze_support


# 父网页的连接,去除页数
base_url = ""


# 通用头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/67.0.3396.79 Safari/537.36',
}


# 初始化url数组
def initialize_url(url):
    url_list = []
    # lent 是需要的页数
    lent = 10
    for counter in range(1,lent):
        url_list.append(url + str(counter) + '.html')
    return url_list


# 通用requests获得html
def get_html(url):
    response = requests.get(url, headers=headers)
    try:
        if response.status_code == 200:
            response.encoding =response.apparent_encoding
            return response.text
    except requests.ConnectionError as e:
        print('Error', e.args)


# 解析父网页,获得子网页的url数组、标题数组、日期数组
def parse_father_html(html):
    if html is not None:
        soup = BeautifulSoup(html, 'html.parser')
        if soup:

            # 解析父网页内容:
            content = soup.find(attrs={'id':''})
            data = content.find_all(href=re.compile(""), attrs={'': ''})
            date = content.find_all(attrs={'': ''})

            # 初始化三个数组:
            url_list = []
            title_list = []
            date_list = []

            # 完成三个数组:
            for item in data:
                # 大多数网页a标签的url都是 "../../*****" 的格式
                # 用正则的sub函数补完url全部内容
                item_content = re.sub('../', 'http://*.*.com/', str(item.attrs['href']))
                url_list.append(item_content)
            for item in data:
                # 正则捕捉所有汉字,去掉item_content内的非汉字字符
                item_content = re.findall('[\u4e00-\u9fa5]', str(item.attrs['title']))
                item_content = re.sub('\'', '', str(item_content))
                item_content = re.sub('\, ', '', str(item_content))
                item_content = re.sub('\[', '', str(item_content))
                item_content = re.sub('\]', '', str(item_content))
                title_list.append(item_content)
            for item in date:
                date_list.append(item.text)
            if url_list is not None and title_list is not None and date_list is not None:
                return url_list, title_list, date_list
            else:
                print("父网页结构有变,请重新编写父网页解析模块")
        else:
            print("父网页汤初始化异常")
    else:
        print("父网页HTML不存在")


# 解析子网页
def parse_child_html(child_html):
    if child_html is not None:
        child_soup = BeautifulSoup(child_html, 'html.parser')
        if child_soup is not None:

            # 解析子网页内容,一般情况下,子网页获得网页p标签即可;
            # 有时可能还需要获得图片,特殊情况特殊考虑
            content = child_soup.find(attrs={'': ''})

            if content is not None:
                return content
            else:
                print("网页结构有变请重新编写子网页解析模块")
        else:
            print("子网页汤初始化异常")
    else:
            print("子网页HTML不存在")


# 输出子网页的内容:
def out_put_html(html_content, title, time):
    # 输出格式 【时间】标题.html
    fout = open('【' + time + '】' + title + '.html', 'w+', encoding='utf-8')
    fout.write("""<!DOCTYPE html><html lang="zh" dir="ltr"><head>
        <meta charset="utf-8"><title></title></head><body>""")
    fout.write(str(html_content))
    fout.write("</body></html>")
    fout.close()


# 主函数
def main(url_item):
    # 获得父网页的html
    html = get_html(url_item)
    # 解析父网页,获得子网页的url数组,标题数组,日期数组
    urls, date, dates = parse_father_html(html)
    # 获得子网页的数量
    lent = len(dates)
    # 循环,逐个获得、解析、输出子网页
    for counter in range(0, lent):
        # 解析子网页html
        children_html = get_html(urls[counter])
        # 获得子网页的内容
        children_content = parse_child_html(children_html)
        # 保存子网页到本地
        out_put_html(str(children_content), str(date[counter]), str(dates[counter]))
        # 每完成一个睡眠1秒
        sleep(1)


# run方法
def run():
    # freeze_support防止pyinstaller打包在windows环境下运行时导致的内存爆炸
    freeze_support()
    # 初始化父网页连接数组
    url_list = initialize_url(base_url)
    # pool进程池,多进程爬虫,提高爬虫运行速度
    pool = Pool(10)
    pool.map(main, url_list)
    pool.close()
    pool.join()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容