循环爬取网页链接

基本原理:

爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
基本过程图:

重点:从访问的页面中抽取新的url链接

可以用正则表达式匹配链接<a href 标签

代码演示:

# coding=utf-8
import requests
import re
def spiderpage(url):kv = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'}r = requests.get(url, headers=kv,timeout=1)r.encoding = r.apparent_encodingpagetext = r.text# 正则表达式表示要爬取的是<a href="和"中的内容,"或'都可以,即当前页面下所有的链接url,返回列表pagelinks = re.findall(r'(?<=<a href=\").*?(?=\")|(?<=href=\').*?(?=\')', pagetext)return pagelinks
def url_filtrate(pagelinks):# 去除不是以要爬取网站开头的url,如跳转的广告等same_target_url = []for l in pagelinks:if re.findall(r'blog.csdn.net/\w+/article/details/\d+', l):# 根据对网页的分析添加筛选条件,过滤掉系统推荐的博文链接if re.findall(r'blockchain_lemon', l):pass# 过滤掉广告链接elif re.findall(r'passport', l):passelse:same_target_url.append(l)# 去除重复urlunrepect_url = []for l in same_target_url:if l not in unrepect_url:unrepect_url.append(l)return unrepect_url
class linkQuence:def __init__(self):# 已访问的url集合self.visited = []# 待访问的url集合self.unvisited = []# 获取访问过的url队列def getvisitedurl(self):return self.visited# 获取未访问的url队列def getunvisitedurl(self):return self.unvisited# 添加url到访问过得队列中def addvisitedurl(self, url):return self.visited.append(url)# 移除访问过得urldef removevisitedurl(self, url):return self.visited.remove(url)# 从未访问队列中取一个urldef unvisitedurldequence(self):try:return self.unvisited.pop()except:return None# 添加url到未访问的队列中def addunvisitedurl(self, url):if url != "" and url not in self.visited and url not in self.unvisited:return self.unvisited.insert(0, url)# 获得已访问的url数目def getvisitedurlount(self):return len(self.visited)# 获得未访问的url数目def getunvistedurlcount(self):return len(self.unvisited)# 判断未访问的url队列是否为空def unvisitedurlsempty(self):return len(self.unvisited) == 0
class Spider():def __init__(self, url):self.linkQuence = linkQuence()  # 将队列引入本类self.linkQuence.addunvisitedurl(url)  # 传入待爬取的url,即爬虫入口def crawler(self,urlcount):# 子页面过多,为测试方便加入循环控制子页面数量x = 1while x <= urlcount:# 若子页面不是很多,可以直接使用队列中的未访问列表非空作为循环条件# while not self.linkQuence.unvisitedurlsempty():if x > 1:print"第",x-1,"个url,开始爬"visitedurl = self.linkQuence.unvisitedurldequence()  # 从未访问列表中pop出一个urlif visitedurl is None or visitedurl == '':continueinitial_links = spiderpage(visitedurl)  # 爬出该url页面中所有的链接#right_links = url_filtrate(initial_links)  # 筛选出合格的链接self.linkQuence.addvisitedurl(visitedurl)  # 将该url放到访问过的url队列中for link in initial_links:  # 将筛选出的链接放到未访问队列中self.linkQuence.addunvisitedurl(link)x += 1print"终于爬完了,一共是",x-2,"个url"return self.linkQuence.visited
def writetofile(list):# 因为第一个爬取的页面为爬虫入口,非需要的博文网址,因此从[1]开始写入f=open("urls.txt","w")for row in list:f.write(row+'\n')f.close()
if __name__ == '__main__':url = "https://www.csdn.net/"spider = Spider(url)#传入要爬取的子链接数量52urllist = spider.crawler(52)writetofile(urllist)

提示:
这个爬虫代码专门为爬取csdn的链接
先访问csdn首页,然后
pagelinks = re.findall(r’(?<=<a href=").?(?=")|(?<=href=’).?(?=’)’, pagetext)
使用re正则表达式模块从页面中抽取链接,生成一个链接数组
需要注意的是代码中定义了 url_filtrate(pagelinks) 函数
该函数对链接数组中的链接进行过滤,使链接有确定的指向方式,避免因访问到登陆页面等而出错

python爬虫学习(循环爬取网页链接)相关推荐

  1. Python爬虫学习笔记 -- 爬取糗事百科

    Python爬虫学习笔记 -- 爬取糗事百科 代码存放地址: https://github.com/xyls2011/python/tree/master/qiushibaike 爬取网址:https ...

  2. Python爬虫学习之爬取淘宝搜索图片

    Python爬虫学习之爬取淘宝搜索图片 准备工作 因为淘宝的反爬机制导致Scrapy不能使用,所以我这里是使用selenium来获取网页信息,并且通过lxml框架来提取信息. selenium.lxm ...

  3. Python爬虫:Xpath爬取网页信息(附代码)

    Python爬虫:Xpath爬取网页信息(附代码) 上一次分享了使用Python简单爬取网页信息的方法.但是仅仅对于单一网页的信息爬取一般无法满足我们的数据需求.对于一般的数据需求,我们通常需要从一个 ...

  4. 网络爬虫学习2 - 爬取网页的通用代码框架、HTTP协议、Requests库的各种方法

    网络爬虫MOOC学习打卡 - 第二天 文章目录 网络爬虫MOOC学习打卡 - 第二天 一.爬取网页的通用代码框架 1.理解requests库的异常 2.Respones类提供了一个方法 -- r.ra ...

  5. 为了部落 来自艾泽拉斯勇士的python爬虫学习心得 爬取大众点评上的各种美食数据并进行数据分析

    为了希尔瓦娜斯 第一个爬虫程序 csgo枪械数据 先上代码 基本思想 问题1 问题2 爬取大众点评 URL分析 第一个难题 生成csv文件以及pandas库 matplotlib.pyplot库 K- ...

  6. python爬虫scrapy框架爬取网页数据_Scrapy-Python

    scrapy Scrapy:Python的爬虫框架 实例Demo 抓取:汽车之家.瓜子.链家 等数据信息 版本+环境库 Python2.7 + Scrapy1.12 初窥Scrapy Scrapy是一 ...

  7. python爬虫学习之爬取全国各省市县级城市邮政编码

    实例需求:运用python语言在ip查询 查ip 网站ip查询 同ip网站查询 iP反查域名 iP查域名 同ip域名网站爬取全国各个省市县级城市的邮政编码,并且保存在excel文件中 实例环境:pyt ...

  8. python爬虫学习之爬取超清唯美壁纸

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...

  9. Python爬虫学习之爬取豆瓣音乐Top250存入Excel表格中

    前言 目标网站:https://music.douban.com/top250 任务: 爬取豆瓣音乐Top250的歌曲名 爬取豆瓣音乐Top250的歌曲对应的表演者.发行时间和音乐流派(分别对应下图斜 ...

  10. python爬虫学习一--爬取网络小说实例

    最近疫情猖獗,长假憋在家里实在无聊,早上突然看了一篇python爬虫文章,当场决定试验一下,参照了一下别人的案例,自己各种踩坑捣鼓了好几个小时,终于成功最后把具体步骤和注意点分享给大家: 1.Pyth ...

最新文章

  1. hashmap value可以为空吗_美团面试题:Hashmap结构,1.7和1.8有哪些区别(最详细解析)...
  2. Java多线程协作CountDownLatch,主线程等待子线程结束
  3. 架构师之路 — 分布式系统 — gRPC 谷歌远程过程调用
  4. Microsoft Office Backstage(第 1 部分 – 幕后故事)
  5. jquery lazy load
  6. php小白书,php小白的自学第一天
  7. 一份从入门到精通NLP的完整指南 | NLPer
  8. SQL Server安装问题程序被挂起的错误解决办法
  9. Elasticsearch--高级-映射_修改映射 数据迁移---全文检索引擎ElasticSearch工作笔记019
  10. 微信小程序开发学习笔记008--微信小程序项目02
  11. EurekaLog发送邮件问题修正
  12. 逍遥单机卡系统服务器ip,逍遥剑侠情缘私服架设源码+APP端+搭建教程
  13. 鸟哥linux命令小结
  14. 蜗居中折射的三类男人
  15. 股票 市盈率(PE)
  16. Programming Rust Fast, Safe Systems Development(译) 表达式(第六章 完)
  17. 如何制作Chrome扩展?<详细教程>
  18. 音视频开发——H265码流解析
  19. SQL Sever数据库存储过程
  20. PHP CURL实现单线程、多线程方法

热门文章

  1. 交换机putty怎么调试_debian10使用putty配置交换机console口
  2. HAMA 混合信道接入Ad-Hoc,分布式TDMA 协议
  3. Adobe illustrator/Ai 2019 软件安装包
  4. linux下大文件分割
  5. 何为挂载(mount)?
  6. Verdi命令行调用选项用法
  7. vue mand-mobile按2.0文档默认安装的是1.6.8版本
  8. 熔断机制什么意思_指数熔断机制是什么意思
  9. Python——玩转Word自动化
  10. 根据url 在ensembl 网站爬取外显子等数据