python多线程爬虫实现(多线程爬腾讯招聘)

1 程序,进程,线程

程序:由源代码生成的可执行应用。(例如:QQ,淘宝等)

进程:一个正在运行的程序可以看做一个进程,进程拥有独立运行所需要的全部资源。(例如:打开 QQ 相当于开启一个进程)

线程:程序中独立运行的代码段。(例如:在 QQ 这个进程中,传输文字是一个线程,传输语音是一个线程,弹出对话框是一个线程。)

2 单线程

原理 :每个正在运行的程序(即进程),至少包含一个线程,这个线程叫做主线程,主线程在程序启动时被创建,用于执行 main 函数,只有一个主线程的程序叫做单线程程序,主线程负责执行程序的所有代码。这些代码只能顺序执行,无法并发执行。

单线程示例:

import time
import random

#单线程爬虫
def download(file_name):
	print(f'{file_name}文件开始下载')
	time.sleep(random.random()*10)
	print(f'{file_name}文件结束下载')


#单线程(默认主线程)
'''
总结:每个正在运行的程序(即进程),至少包含一个线程,
这个线程叫做主线程,主线程在程序启动时被创建,用于执行main函数,
只有一个主线程的程序叫做单线程程序,主线程负责执行程序的所有代码。
这些代码只能顺序执行,无法并发执行。
'''

if __name__ =="__main__":
	for i in range(5):
		download(i)

3.多线程

多线程定义:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程优点:可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
所以为了提高爬虫的效率,我们可以使用多线程来下载文件,在 python 中我们使用
threading 模块来创建多线程,从而实现多线程爬虫。(补充:Python3 不能再使用 thread 模
块)。

使用:启动一个线程就是把函数传入并创建一个 Thread 实例,然后调用 start()方法。

多线程示例1:

'''
1.多线程定义:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多
个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程
来完成各自的任务。
2.多线程优点:可以提高CPU的利用率。
3.在python中我们使用threading模块来创建多线程,从而实现多线程爬虫。
'''

import time
import random
import threading

def download(fileName):
	print(f'{fileName}文件开始下载')
	time.sleep(random.random() * 10)
	print(f'{fileName}文件结束下载')

#多线程
if __name__=='__main__':
	for i  in range(5):
	
		#启动一个线程就是把函数传入并创建一个Thread实例,然后调用start()fangfa
		#创建线程,并将参数传递给函数
		
		t = threading.Thread(target=download,args=(i,))
		t.start()

多线程爬取腾讯招聘:

from selenium import webdriver
from lxml import etree
import time,pymongo
import threading
class Tencent(threading.Thread):
    def __init__(self,url):
        #要传参数,必须在init方法中调用父类的init方法
        threading.Thread.__init__(self)
        self.base_url = url
        # self.parse()
    def run(self):
        self.parse()

    def myBrowser(self,url):
        driver = webdriver.PhantomJS()
        driver.get(url)
        time.sleep(1)
        return etree.HTML(driver.page_source)

    def parse(self):
        # i=0
        # while True:
        #     if i>400:
        #         break
        #     i+=1
            #https://careers.tencent.com/search.html?index=2
            # url = self.base_url+'?index={}'.format(i)
            html = self.myBrowser(self.base_url)
            # print(html)
            self.parse_detail(html)

    def save_to_mongo(self,item):
        #创建一个链接
        # client = pymongo.MongoClient('mongodb://username:password@localhost:27017')
        client = pymongo.MongoClient('localhost')
        #创建一个数据库
        db = client['tencent']
        db['tencent'].insert(item)


    def get_text(self,text):
        if text:
            return text[0]
        return ''

    def parse_detail(self,html):
        work_div_list = html.xpath('//div[@class="recruit-list"]')
        # print(work_div_list)
        for site in work_div_list:
            item = {}
            #岗位名称
            employ_name = self.get_text(site.xpath('.//h4[@class="recruit-title"]/text()'))
            # print(employ_name)
            item['employ_name']=employ_name
            self.save_to_mongo(item)

if __name__ == '__main__':
    base_url = 'https://careers.tencent.com/search.html'
    # for i in range(3):
    #     t = Tencent(base_url)
    #     t.start()
    i = 0
    while True:
        if i > 10:
            break
        i += 1
        url = base_url + '?index={}'.format(i)
        t = Tencent(url)
        t.start()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值