写点什么

python 爬虫如何爬取动态生成的网页内容

  • 2024-11-01
    福建
  • 本文字数:1598 字

    阅读完需:约 5 分钟

【背景】


对于网页信息的采集,静态页面我们通常都可以通过 python 的 request.get()库就能获取到整个页面的信息。


但是对于动态生成的网页信息来说,我们通过 request.get()是获取不到。


【方法】


可以通过 python 第三方库 selenium 来配合实现信息获取,采取方案:python + request + selenium + BeautifulSoup


我们拿纵横中文网的小说采集举例(注意:请查看网站的 robots 协议找到可以爬取的内容,所谓盗亦有道):


思路整理:


1.通过 selenium 定位元素的方式找到小说章节信息

2.通过 BeautifulSoup 加工后提取章节标题和对应的各章节的链接信息

3.通过 request +BeautifulSoup 按章节链接提取小说内容,并将内容存储下来


【上代码】


1.先在开发者工具中,调试定位所需元素对应的 xpath 命令编写方式



 2.通过 selenium 中 find_elements()定位元素的方式找到所有小说章节,我们这里定义一个方法接受参数来使用


def Get_novel_chapters_info(url:str,xpath:str,skip_num=None,chapters_num=None):    # skip_num 需要跳过的采集章节(默认不跳过),chapters_num需要采集的章节数(默认全部章节)        # 创建Chrome选项(禁用图形界面)        chrome_options = Options()        chrome_options.add_argument("--headless")        driver = webdriver.Chrome(options=chrome_options)        driver.get(url)        driver.maximize_window()        time.sleep(3)        # 采集小说的章节元素        catalogues_list = []        try:            catalogues = driver.find_elements(By.XPATH,xpath)            if skip_num is None:                for catalogue in catalogues:                    catalogues_list.append(catalogue.get_attribute('outerHTML'))                driver.quit()                if chapters_num is None:                    return catalogues_list                else:                    return catalogues_list[:chapters_num]            else:                for catalogue in catalogues[skip_num:]:                    catalogues_list.append(catalogue.get_attribute('outerHTML'))                driver.quit()                if chapters_num is None:                    return catalogues_list                else:                    return catalogues_list[:chapters_num]        except Exception:            driver.quit()
复制代码


3.把采集到的信息通过 beautifulsoup 加工后,提取章节标题和链接内容


# 获取章节标题和对应的链接信息        title_link = {}        for each in catalogues_list:            bs = BeautifulSoup(each,'html.parser')            chapter = bs.find('a')            title = chapter.text            link = 'https:' + chapter.get('href')            title_link[title] = link
复制代码


4.通过 request+BeautifulSoup 按章节链接提取小说内容,并保存到一个文件中


# 按章节保存小说内容        novel_path = '小说存放的路径/小说名称.txt'        with open(novel_path,'a') as f:            for title,url in title_link.items():                response = requests.get(url,headers={'user-agent':'Mozilla/5.0'})                html = response.content.decode('utf-8')                soup = BeautifulSoup(html,'html.parser')                content = soup.find('div',class_='content').text                # 先写章节标题,再写小说内容                f.write('---小西瓜免费小说---' + '\n'*2)                f.write(title + '\n')                f.write(content+'\n'*3)
复制代码


文章转载自:潘_谈

原文链接:https://www.cnblogs.com/123gogogo/p/18517392

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
python 爬虫如何爬取动态生成的网页内容_Python_快乐非自愿限量之名_InfoQ写作社区