使用多线程和日志爬取任意网站

使用多线程和日志爬取任意网站

import threading
from queue import Queue
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
import logging
#创建采集线程列表
#创建解析线程列表
g_crawl_list = []
g_parse_list = []
class CrawlThread(threading.Thread):
    def __init__(self,name,data_queue):
        super(CrawlThread,self).__init__()
        self.name = name
        self.data_queue = data_queue

    def run(self):
        # 打开浏览器
        driver = webdriver.Firefox()
        driver.get('http://t.people.com.cn/login.action')
        wait = WebDriverWait(driver, 10)
        username = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#userName'))
        )
        username.send_keys('17332335684')
        password = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#password'))
        )
        password.send_keys('zgx675050748')
        time.sleep(4)
        password.send_keys(Keys.ENTER)
        # 爬取内容
        for i in range(0, 5):
            time.sleep(3)
            driver.execute_script('window.scrollTo(0,1000000)')
            time.sleep(3)
            driver.execute_script('window.scrollTo(0,1000000)')
            time.sleep(3)
            driver.execute_script('window.scrollTo(0,1000000)')
            time.sleep(3)
            comments = driver.find_elements_by_xpath("//a[@data-nodetype='btn_comment']")
            for comment in comments:
                comment.click()
            url = driver.page_source
            suo = threading.Lock()
            suo.acquire()
            self.data_queue.put(url)
            suo.release()
            next = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, '.wbp_pagelist_nextbtn'))
            )
            logger = logging.getLogger(__name__)
            logger.setLevel(level=logging.DEBUG)

            # 获取文件处理器,并设置级别
            handler = logging.FileHandler("采集1号.log")
            # handler = logging.FileHandler("./logs/log.csv")
            handler.setLevel(logging.INFO)

            # 获取并设置文件处理器的日志格式
            formatter = logging.Formatter('%(asctime)s,%(name)s,%(levelname)s,%(message)s')
            handler.setFormatter(formatter)

            # 设置日志处理器
            logger.addHandler(handler)

            # 打印日志
            logger.info("Start print log")
            logger.debug("Do something")
            logger.warning("Something maybe fail.")
            logger.info("Finish")
            next.click()
        time.sleep(3)
        driver.quit()
        # 获取logger对象,设置日志级别

class CrawlThread2(threading.Thread):
    def __init__(self,name,data_queue):
        super(CrawlThread2,self).__init__()
        self.name = name
        self.data_queue = data_queue

    def run(self):
        # 打开浏览器
        driver = webdriver.Firefox()
        driver.get('http://t.people.com.cn/login.action')
        wait = WebDriverWait(driver, 10)
        username = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#userName'))
        )
        username.send_keys('17332335684')
        password = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#password'))
        )
        password.send_keys('zgx675050748')
        time.sleep(4)
        password.send_keys(Keys.ENTER)
        # 爬取内容
        time.sleep(3)
        driver.execute_script('window.scrollTo(0,1000000)')
        time.sleep(3)
        driver.execute_script('window.scrollTo(0,1000000)')
        time.sleep(3)
        driver.execute_script('window.scrollTo(0,1000000)')
        time.sleep(3)
        comment = driver.find_element_by_xpath("//*[@id='feedListPage']/div/a[5]")
        comment.click()

        for i in range(0, 5):
            time.sleep(3)
            driver.execute_script('window.scrollTo(0,1000000)')
            time.sleep(3)
            driver.execute_script('window.scrollTo(0,1000000)')
            time.sleep(3)
            driver.execute_script('window.scrollTo(0,1000000)')
            time.sleep(3)
            comments = driver.find_elements_by_xpath("//a[@data-nodetype='btn_comment']")
            for comment in comments:
                comment.click()
            url = driver.page_source
            suo = threading.Lock()
            suo.acquire()
            self.data_queue.put(url)
            suo.release()
            next = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, '.wbp_pagelist_nextbtn'))
            )
            # 获取logger对象,设置日志级别
            logger = logging.getLogger(__name__)
            logger.setLevel(level=logging.DEBUG)

            # 获取文件处理器,并设置级别
            handler = logging.FileHandler("采集2号.log")
            # handler = logging.FileHandler("./logs/log.csv")
            handler.setLevel(logging.INFO)

            # 获取并设置文件处理器的日志格式
            formatter = logging.Formatter('%(asctime)s,%(name)s,%(levelname)s,%(message)s')
            handler.setFormatter(formatter)

            # 设置日志处理器
            logger.addHandler(handler)

            # 打印日志
            logger.info("Start print log")
            logger.debug("Do something")
            logger.warning("Something maybe fail.")
            logger.info("Finish")
            next.click()
        time.sleep(3)
        driver.quit()




class ParseThread(threading.Thread):
    def __init__(self,name,data_queue):
        super(ParseThread,self).__init__()
        self.name = name
        self.data_queue = data_queue

    def run(self):
        for a in range(0,10):
            f = open(str(a)+'.html','a',encoding='utf-8')
            f.write(self.data_queue.get())
            f.close()
            logger = logging.getLogger(__name__)
            logger.setLevel(level=logging.DEBUG)

            # 获取文件处理器,并设置级别
            handler = logging.FileHandler("解析1号.log")
            # handler = logging.FileHandler("./logs/log.csv")
            handler.setLevel(logging.INFO)

            # 获取并设置文件处理器的日志格式
            formatter = logging.Formatter('%(asctime)s,%(name)s,%(levelname)s,%(message)s')
            handler.setFormatter(formatter)

            # 设置日志处理器
            logger.addHandler(handler)

            # 打印日志
            logger.info("Start print log")
            logger.debug("Do something")
            logger.warning("Something maybe fail.")
            logger.info("Finish")


def create_crawl_thread(data_queue):
    crawl_name1 = ['采集1号']
    for name in crawl_name1:
        crawl  = CrawlThread(name,data_queue)
        g_crawl_list.append(crawl)
    crawl_name2 = ['采集2号']
    for name in crawl_name2:
        crawl  = CrawlThread2(name,data_queue)
        g_crawl_list.append(crawl)

def create_parse_thread(data_queue):
    parse_name = ['解析1号']
    for name in parse_name:
        parse = ParseThread(name,data_queue)
        g_parse_list.append(parse)

def create_queue():
    #创建内容(源代码)队列
    data_queue = Queue()
    return data_queue

def main():
    data_queue = create_queue()
    #创建采集线程
    create_crawl_thread(data_queue)
    create_parse_thread(data_queue)
    #启动采集线程
    for crawl in g_crawl_list:
        crawl.start()
    #启动解析线程
    for parse in g_parse_list:
        parse.start()
    #主线程等待
    for crawl in g_crawl_list:
        crawl.join()
    for parse in g_parse_list:
        parse.join()
    print('所有线程全部结束')

if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Selenium是一个用于Web自动化测试的工具,它可以模拟用户在浏览器中的操作,例如点击链接、填写表单、提交数据等。Selenium支持多线程和异步爬取,这些功能可以提高爬取效率。 如果您使用Selenium进行Web爬取,可以采用以下一些方法来提高爬取效率: 1. 使用headless模式:在headless模式下,Selenium可以在后台运行,不需要显示浏览器界面,这可以减少资源消耗,提高爬取效率。 2. 合理设置等待时间:在进行Web爬取时,页面加载需要一定的时间,而等待时间过长会浪费时间,等待时间过短又会导致页面没有加载完全。因此,您需要根据实际情况合理设置等待时间。 3. 使用代理IP:如果您需要大规模爬取数据,可以使用代理IP,这可以有效地避免被封IP。 4. 使用分布式爬虫:使用分布式爬虫可以将任务分配给多个机器或进程,这可以大大提高爬取效率。 总的来说,Selenium具有多线程和异步爬取的优势,可以提高爬取效率,但在使用时需要注意合理设置等待时间、使用代理IP等。 ### 回答2: 使用selenium多线程和异步爬取的效率取决于具体情况和使用的方式。 在一些特定的情况下,使用selenium多线程可能会更高效。多线程可以同时执行多个任务,可以将爬取任务分配给不同的线程并行执行,从而提高整体的爬取效率。这对于需要同时处理多个任务的情况,如同时爬取多个网页或者进行大规模数据抓取时,可以充分利用CPU和网络资源,提高整体的爬取速度。然而,需要注意的是,使用多线程也存在线程间的竞争和同步问题,如果处理不当可能会导致资源争用和性能下降。 另一方面,异步爬取也具有高效的特点。异步爬取利用非阻塞的方式发送和处理请求,可以在发送请求的同时处理其他任务,从而提高整体的爬取效率。相比于传统的同步请求方式,异步爬取可以充分利用网络带宽,减少等待时间,提高爬取速度。尤其适用于需要大量请求或者请求响应时间较长的情况下,如爬取API数据或者动态网页内容。然而,异步爬取也需要适当的协程调度和处理异步回调,一些网站可能会限制同时并发的请求数目,如果不加控制可能会导致反爬机制的触发。 总之,使用selenium多线程和异步爬取的效率取决于具体需求和实现方式。需要根据实际情况选择合适的方法,并对其进行调优,以提高爬取效率。 ### 回答3: 使用Selenium多线程和异步爬取的效率取决于具体的爬取任务和网站结构。在一些情况下,使用Selenium多线程可能效率更高,而在其他情况下,异步爬取可能效率更高。 首先,使用Selenium多线程可以同时打开多个浏览器窗口,每个窗口都可以执行独立的操作。这对于需要同时执行多个操作的任务非常有用,例如需要在不同的页面中执行交互操作然后获取数据的情况。多线程可以提高同时处理任务的能力,从而加快爬取的速度。 然而,Selenium多线程也存在一些限制。首先,每个浏览器窗口都需要占用相应的系统资源,包括内存和处理器。如果需要打开大量的窗口,可能会导致系统资源不足,从而影响整体效率。此外,Selenium在打开和关闭浏览器窗口时也会产生一定的时间开销,这可能影响爬取速度。 相比之下,异步爬取通过利用非阻塞式的编程方式,可以同时发送多个请求并处理响应。这种方式可以提高请求的并发性,从而加快爬取的速度。异步爬取也可以避免浏览器窗口的开销,并节省系统资源。在一些数据库查询较多而网页渲染较少的任务中,异步爬取可能更适合。 总之,使用Selenium多线程和异步爬取的效率取决于具体情况。需要根据任务的特点和网站的结构来选择合适的方法,以提高爬取速度和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值