有思俱乐部学习园地

递归爬取所有网页


简介

  爬虫最主要的功能就是递归爬取所有页面了,但资料很少,此处对递归爬取做一些总结,并附带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
关键字修改:陈鑫