python爬虫-爬取动态内容

selenium 库 是模拟用户点击从而实现爬取网页动态。
导入 from selenium import webdriver 模块 爬取military.cctv官网

#导包
import gevent
#猴子补丁
from gevent import monkey
#优化本身的线程
monkey.patch_all()

#此模块得在gevent 后面
import requests
import re
import os
from lxml import etree
#导入selenium 模拟浏览器行为
from selenium import webdriver
import time

#定义全局变量
global_url_list = []

#定义抓取类
class GeventSpider(object):

#定义局部变量
encloseing_url_list = []

#定义爬取内页逻辑
def get_inner(self,url):
    #发送请求
    r = requests.get(url)
    html = r.content.decode('utf-8')
    #正则匹配标题  re.I 不区分大小写
    regex = re.compile('

(.+?)<\/h1>',re.I) a = regex.findall(html) h = str(a).split('')[-1].split('')[0] print(h)

#定义数据匹配方法
def get_xpath(self,html):
    
    #初始化xml
    html = etree.HTML(html)
    #匹配url
    html_data_url = html.xpath("//span[@class='l']/a/@href")
    #声明全局变量
    global global_url_list
    #赋值给全局变量
    global_url_list = html_data_url
    #打印出现匹配到的条数
    print(len(html_data_url))

    #赋值给 encloseing_url_list 就不需要外部 global global_url_list
    self.encloseing_url_list = html_data_url

#定义抓取方法
def run(self,url):
    #抓取写文件
    if url == 'http://military.cctv.com/':
        file_name = 'test_cctv.html'
    else:
        file_name = 'inner_cctv.html'

    html_content = ''
    #使用os模块来判断文件是否存在
    if not os.path.exists(file_name):

        #发送http请求
        # r = requests.get(url)
        #解码
        # html = html.content.decode("utf-8")

        #定义浏览器对象
        browser = webdriver.Chrome()
        #发送请求
        browser.get(url)
        #解码赋值
        html = browser.page_source.encode('utf-8').decode()

        time.sleep(1)
        #关闭浏览器
        browser.quit()

        #写文件 指定文件编码
        with open('./'+file_name,'w',encoding='utf-8') as f:
            f.write(html)
        html_content = html
    else:
        #读取文件返回
        with open('./'+file_name,encoding='utf-8') as f:
            contents = f.read()
        html_content = contents

    self.get_xpath(html_content)

if __name__ == "__main__":
    #实例化一个对象
    geventspider = GeventSpider()
    #定义一个urllist
    url_list = ['http://military.cctv.com/']
    # #定义一个任务列表 方便阻塞协程
    # job_list = []
    # for item in url_list:
    #     #启动协程
    #     job_list.append(gevent.spawn(geventspider.run,item))

#定义第二种方法(列表推导式)
# job_list = [gevent.spawn(geventspider.run,url) for url in url_list ]
#阻塞协程
# gevent.joinall(job_list)


#请求首页,没必要开协程
geventspider.run(url_list[0])
#使用协程,同时爬取14个内页
url_list = geventspider.encloseing_url_list
# print(url_list)

# #只走一条测试
# geventspider.get_inner(url_list[0])
#启动协程爬取内页
job_list = [gevent.spawn(geventspider.get_inner,url) for url in url_list ]
#阻塞协程
gevent.joinall(job_list)

你可能感兴趣的:(python,python)