Python网络爬虫笔记(二):链接爬虫和下载限速
(一)代码1(link_crawler()和get_links()实现链接爬虫)
import urllib.request as ure
import re
import urllib.parse
from delayed import WaitFor
#下载网页并返回HTML(动态加载的部分下载不了)
def download(url,user_agent='Socrates',num=2):
print('下载:'+url)
#设置用户代理
headers = {'user_agent':user_agent}
request = ure.Request(url,headers=headers)
try:
#下载网页
html = ure.urlopen(request).read()
except ure.URLError as e:
print('下载失败'+e.reason)
html=None
if num>0:
#遇到5XX错误时,递归调用自身重试下载,最多重复2次
if hasattr(e,'code') and 500<=e.code<600:
return download(url,num-1)
return html
#seed_url传入一个url
#link_regex传入一个正则表达式
#函数功能:提取和link_regex匹配的所有网页链接并下载
def link_crawler(seed_url, link_regex):
html = download(seed_url)
crawl_queue = []
#迭代get_links()返回的列表,将匹配正则表达式link_regex的链接添加到列表中
for link in get_links(html):
if re.match(link_regex, link):
#拼接https://www.cnblogs.com/ 和 /cate/...
link = urllib.parse.urljoin(seed_url, link)
#不在列表中才添加
if link not in crawl_queue:
crawl_queue.append(link)
#调用WaitFor的wait()函数,下载限速,间隔小于2秒则等待,直到时间等于2秒才继续下载(大于则直接继续下载)
waitFor = WaitFor(2)
#下载crawl_queue中的所有网页
while crawl_queue:
#删除列表末尾的数据
url = crawl_queue.pop()
waitFor.wait(url)
download(url)
#传入html对象,以列表形式返回所有链接
def get_links(html):
#使用正则表达式提取html中所有网页链接
webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE)
html = html.decode('utf-8')
# 以列表形式返回所有网页链接
return webpage_regex.findall(html) link_crawler('https://www.cnblogs.com/','/cate/.*')
(二)delayed.py(实现下载限速的类)
import urllib.parse
import datetime
import time
class WaitFor(): def __init__(self,delay):
#delay:希望延迟多长时间(wait()中的处理是以秒为单位)
self.delay = delay
#用来存放上次下载时间
self.domains = dict() def wait(self,url):
#获取url netloc属性的值(即www.cnblogs.com,// 和第一个 /之间的内容)
domain = urllib.parse.urlparse(url).netloc
#存在键值为domain的数据返回value值,否则返回None
last_down = self.domains.get(domain)
if self.delay >0 and last_down is not None:
# 希望延迟时间 - (当前时间-上次下载时间),seconds时间间隔以秒为单位显示
sleep_sec = self.delay-(datetime.datetime.now()-last_down).seconds
if sleep_sec > 0:
time.sleep(sleep_sec)
#将当前时间添加到domains中
self.domains[domain] = datetime.datetime.now()
Python网络爬虫笔记(二):链接爬虫和下载限速的更多相关文章
- Python网络编程笔记二
使用select模块实现IO多路复用服务端 import socket import select #windows上只支持select.select,不支持poll epoll HOST = &qu ...
- 2.Python爬虫入门二之爬虫基础了解
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- Python爬虫入门二之爬虫基础了解
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- 转 Python爬虫入门二之爬虫基础了解
静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...
- Python网络数据采集PDF高清完整版免费下载|百度云盘
百度云盘:Python网络数据采集PDF高清完整版免费下载 提取码:1vc5 内容简介 本书采用简洁强大的Python语言,介绍了网络数据采集,并为采集新式网络中的各种数据类型提供了全面的指导.第 ...
- Python网络爬虫笔记(五):下载、分析京东P20销售数据
(一) 分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1. 翻页的时候,谷歌F12的Network页签可以看到下面 ...
- nodejs爬虫笔记(二)---代理设置
node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var chee ...
- python之爬虫(二)爬虫的原理
在上文中我们说了:爬虫就是请求网站并提取数据的自动化程序.其中请求,提取,自动化是爬虫的关键!下面我们分析爬虫的基本流程 爬虫的基本流程 发起请求通过HTTP库向目标站点发起请求,也就是发送一个Req ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- Python网络编程基础|百度网盘免费下载|零基础入门学习资料
百度网盘免费下载:Python网络编程基础|零基础学习资料 提取码:k7a1 目录: 第1部分 底层网络 第1章 客户/服务器网络介绍 第2章 网络客户端 第3章 网络服务器 第4章 域名系统 第5章 ...
随机推荐
- js通过a链接控制多个DIV只显示其中一个其它隐藏
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 如何修改HTML5 input placeholder 颜色
有三种实现方式:伪元素(pseudo-elements).伪类( pseudo-classes)和Notihing. WebKit和Blink(Safari,Google Chrome, Opera1 ...
- C++ STL常用容器基本用法汇总
1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...
- 项目Alpha冲刺Day6
一.会议照片 二.项目进展 1.今日安排 熟悉后台框架并编写.继续搭建前台框架模版.熟悉前端框架开发流程.完成前端热部署配置.完成部分后台用户信息相关接口.解决后台jdk1.8日期在框架中的使用. 2 ...
- Android 4.4 沉浸式透明状态栏
原文链接:http://www.bkjia.com/Androidjc/913061.html 第一种方法 这里写代码片第一种方法,在代码设置: if(VERSION.SDK_INT >= VE ...
- MSSQL 2000 错误823恢复
一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...
- NYOJ 炫舞家st
#include <iostream>#include <cstring>#include <algorithm>using namespace std; cons ...
- EasyUI中Tabs添加远程数据的方法。
tabs加载远程数据: $(function () { $("#btnquery").click(function () { if (!$("#tcontent" ...
- Django-rest-framework源码分析----权限
添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permission.py class SVIPPr ...
- Python struct模块
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...