递归爬取所有网页
简介
爬虫最主要的功能就是递归爬取所有页面了,但资料很少,此处对递归爬取做一些总结,并附带python的基本语法介绍
一、初始代码解析
以下代码是scrapy的基础代码,每行代码均有注释。
#-*-coding:utf-8-*-
#支持中文必须加上上面一句话
__author__ = 'Administrator'
#包含scapy库
import scrapy
#构建爬虫类,必须继承自scrapy.spiders.Spider
class ApiSpider(scrapy.spiders.Spider):
#名字,配置名,会用到.
name = "api"
#只爬api.1473.cn网址
allowed_domains=["api.1473.cn"]
#开始爬的网址
start_urls=[
"http://api.1473.cn"
]
#请求入口,相当于java中的serverlet.
def parse(self, response):
#得到http://api.1473.cn的网址。
allUrl=response.url
#输出
print allUrl
1、scrapy 全局变量:
#名字,配置名,会用到.
name = "api"
#只爬api.1473.cn网址
allowed_domains=["api.1473.cn"]
#开始爬的网址
start_urls=[
"http://api.1473.cn"
]
为不可更改的全局变量,只能修改为自己的值,变量名不可修改。
2、请求的入口为以下代码,相当于java中的serverlet
#请求入口,相当于java中的serverlet.
def parse(self, response):
#得到http://api.1473.cn的网址。
allUrl=response.url
#输出
print allUrl
二、获取网页中的所有超级链接,并递归爬取所有网页
#定义全局变量,目的是去除重复的url。
URLS=[]
# 下面的正则会提取页面中所有的后缀名为.aspx,.html .htm的超级链接,然后循环递归
pattern=re.compile(r'((((https|http):\/\/)|\/)[0-9a-zA-Z\/\.@-_%]*?\.(aspx|html|htm))')
urls=pattern.findall(response.text)
for url in urls:
#去除重复url
findUrl=url[0]
if findUrl in self.URLS:
continue
else:
self.URLS.append(findUrl)
#Request对象需要包含from scrapy.http import Request
#递归获取
yield Request(findUrl,callback=self.parse)
注:下面两行代码可以获取页面中的所有超级链接
re.compile(r'((((https|http):\/\/)|\/)[0-9a-zA-Z\/\.@-_%]*?\.(aspx|html|htm))') 此正则可以获取页面中的所有超级链接
注:下面的循环是对超级链接进行递归
for url in urls:
#去除重复url,此处代码未列出,自己可以实现。
#Request对象需要包含from scrapy.http import Request
#递归获取
yield Request(findUrl,callback=self.parse)
三、完整的递归编码如下
#-*-coding:utf-8-*-
#支持中文必须加上上面一句话
__author__ = 'Administrator'
import scrapy
#正则表达式模块
import re
#包含scrapy中的Request请求,在yield request中用到
from scrapy.http import Request
class ApiSpider(scrapy.spiders.Spider):
name = "api"
#只爬api.1473.cn网址
allowed_domains=["api.1473.cn"]
#开始爬的网址
start_urls=[
"http://api.1473.cn"
]
#目的是去除重复的url。
URLS=[]
def parse(self, response):
# 下面的正则会提取页面中所有的后缀名为.aspx,.html .htm的超级链接,然后循环递归
pattern=re.compile(r'((((https|http):\/\/)|\/)[0-9a-zA-Z\/\.@-_%]*?\.(aspx|html|htm))')
urls=pattern.findall(response.text)
for url in urls:
#去除重复
findUrl=url[0]
if findUrl in self.URLS:
continue
else:
self.URLS.append(findUrl)
#Request对象需要包含from scrapy.http import Request
#递归获取
yield Request(findUrl,callback=self.parse)
工作人员
作者:XXX
信息录入:XXX
文案编辑:XXX
视频录制:XXX
视频编辑:XXX
图片编辑:XXX
关键字修改:陈鑫