实战爬虫:python爬虫学习笔记之爬取搜狗|微信文章——动态网页爬取
发布日期:2021-06-30 15:42:16 浏览次数:2 分类:技术文章

本文共 2786 字,大约阅读时间需要 9 分钟。

本文是我在使用网易云课堂学习日月光华老师讲的“Python爬虫零基础入门到进阶实战”课程所做的笔记,如果大家觉得不错,可以去看一下老师的视频课,讲的还是很棒的。

1. 动态网页

所谓动态网页,是跟静态网页相对应的一种网页编程技术。静态网页随着HTML代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非修改页面代码,而动态网页则不然,页面代码虽然没有变化,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生该百年的。

动态网页一般使用叫做AJAX的快速动态创建网页技术,通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对王爷的某部分内容进行更新。

2. 判断一个网页是不是动态网页

  1. 是否在URL不变或者未刷新的情况下,能够加载新的信息。
  2. 网页的源代码结构与显示不同

3. 动态网页的爬取办法

  1. 分析网页请求,查找真实请求的URL
  2. 使用Selenium模拟浏览器行为

4. 实例:爬取搜狗|微信文章

微信|搜狗首页

微信|搜狗动态网页部分
如图,在首页中,下拉会显示加载更多内容那个。在URL未改变的情况加网页发生了变化,由此可知是动态网页
目标:爬取热门栏目前十页内容。
首先,分析网址,当我们第一次点击加载更多内容时,Network显示,会请求1.html在这里插入图片描述
其URL为:https://weixin.sogou.com/pcindex/pc/pc_0/1.html
当我们继续第二次点击加载更多内容时,Network显示,会请求2.html
在这里插入图片描述
其URL为:https://weixin.sogou.com/pcindex/pc/pc_0/2.html
继续点击,请求3.html
在这里插入图片描述
其URL为:https://weixin.sogou.com/pcindex/pc/pc_0/3.html
由此类推,搜狗|微信首页的加载更多内容是通过请求不同的url来进行加载的。
我们如果爬取前十页内容,只需要根据规律构造URL,进行爬取即可。

import requestsfrom lxml import etree# 引入random是为了可以随机的从代理IP中抽取一个IPimport random# punctuation为标点符号集,为了删除文章题目中的标点符号from string import punctuationimport reimport timedef download(url):    """    下载网址内容,返回选择器    :param url: 网址    :return: 对应网址选择器    """    headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'} # 定义代理IP列表 time.sleep(2) proxies = [ {
"HTTPS": "https://117.69.201.218:24907"}, {
"HTTPS": "https://117.57.91.57:46149"}, {
"HTTPS": "https://117.91.133.18:9999"}, {
"HTTPS": "https://183.129.207.78:18118"} ] # random.choice 从列表中随机选取一个 r = requests.get(url, proxies=random.choice(proxies), headers=headers) # r = requests.get(url, headers=headers) # 设置编码方式 r.encoding = 'utf-8' return etree.HTML(r.text)def spider_detail(article_url): """ 爬取某一篇文章的标题和内容,并写文件 :param article_url: 文章URL """ selector = download(article_url) title = selector.xpath('//h2[@class="rich_media_title"]/text()')[0].strip() content = selector.xpath('string(//*[@class="rich_media_content "])').strip() data_write(content, title)def data_write(content, title): """ 保存文章的题目和内容 # 在字符串前面加上一个r表示原生字符串 # 不转义字符不需要再次被转义 # 即字符串均为显示内容,无任何转义内容 :param content: 内容 :param title: 题目 """ title = re.sub(r'[{}]+'.format(punctuation), '', title) with open('./wenzhang/' + title + '.txt', 'wt', encoding='utf-8') as f: f.write(content) print('正在下载:', title)def spider(num): for i in range(1, num+1): url = 'https://weixin.sogou.com/pcindex/pc/pc_0/{}.html'.format(i) selector = download(url) all_article = selector.xpath('/html/body/li') for article in all_article: article_url = article.xpath('div[2]/h3/a/@href')[0] spider_detail(article_url)page_count = input("请输入您想爬取的页数:")spider(page_count)

运行结果:

在这里插入图片描述
在这里插入图片描述

转载地址:https://kaisarh.blog.csdn.net/article/details/102980421 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:实战HTML:动画背景网站登录界面
下一篇:爬虫:学习笔记之常见反爬虫策略及应对技巧

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月16日 14时38分11秒