多线程爬取学习通题库

今天在网上发现了一个学习通题库网站,正好最近也在研究怎么搭建题库,于是就写了一个多线程爬虫,爬取网站所有的题目。

下面是我写的代码

import requests
import re
from lxml import etree
import queue
import threading
import os


headers = {
          
   
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36,
}


# 保存位置
PATH = "G:爬虫下载学习通题库期末考试题库\"


# 队列
Q = queue.Queue()


# 往队列里放内容(采集函数)
def craw_list(i):
    url = http://www.cxeytk.com/ajax/ajaxLoadModuleDom_h.jsp
    data = {
          
   
        cmd: getWafNotCk_getAjaxPageModuleInfo,
        _colId: 105,
        _extId: 0,
        moduleId: 328,
        href: /col.jsp?m328pageno={}&id=105.format(i),
        newNextPage: false,
        needIncToVue: false,
    }
    r = requests.post(url=url, headers=headers, data=data)
    # 题库链接
    ret_list = re.findall(r"<a class=fk-newsListTitle hidefocus=true href=(.*?) target=_blank title=(.*?)>", r.text)

    for ret in ret_list:
        link = http://www.cxeytk.com/ + ret[0].replace(r", )
        title = ret[1].replace(r", )
        # print(link, title)
        Q.put([link, title])


# 从队列里取东西(下载函数)
def run():
    # 循环从队列中读取
    while True:
        if not t1.is_alive():
            # print("采集已完毕!!!")
            if Q.empty():
                break
        link = Q.get()[0]
        title = Q.get()[1]
        # 对链接发送get请求
        r = requests.get(url=link, headers=headers)
        tree = etree.HTML(r.text)
        # 获取所有文本
        try:
            text_list = tree.xpath(//div[@class="richContent  richContent3"]//text())
        except:
            text_list = []
        # print(text_list)
        content = 
        for text in text_list:
            content = content + text + 

        if not os.path.exists(PATH):
            os.makedirs(PATH)
        with open(PATH + {}.txt.format(title), w, encoding=utf-8) as f:
            f.write(content)
        # 界面友好提示
        print(==={}===已下载.format(title))


def main(start, end):
    for i in range(start, end):
        craw_list(i)


if __name__ == __main__:
    # 开启多线程
    # 采集
    t1 = threading.Thread(target=main, args=(1, 37))
    # 下载
    t2 = threading.Thread(target=run)
    t3 = threading.Thread(target=run)
    t4 = threading.Thread(target=run)

    t1.start()
    t2.start()
    t3.start()
    t4.start()

好了,今天的分享就到这里了,希望对大家有所帮助!

经验分享 程序员 微信小程序 职场和发展