python爬虫爬取全站url,完美小demo(可防止链接到外网等各种强大筛选)

系统 1610 0

上次完成的url爬取项目并不能满足需求,在此完成了一个更为强大的爬取代码,有需要的可以直接运行,根据自己爬取的网站更改部分正则和形参即可。前排提示:运行需要耐心,因为几千个url爬完的话,还是建议花生瓜子可乐电影准备好。

下面是代码,代码有注释,很容易理解。

注意:爬虫代码每过一段时间就 需要更新,因为爬的东西在变,所以可能过一段时间就要更新爬虫。

            
              # -*- coding: utf-8 -*-
"""
Created on Wed Sep 29 14:01:28 2018

@author: ESionJL数据猫

question:1.当前url若爬取到的pagelinks为[],则将其移除visited列表。
         2.spiderpage()函数中,当前url爬取到的网页为UNknown,会报错,如何规避,并将此url移除。
         3.返回title为空
         4.网站不可加载
         5.过期网站,垃圾网站

"""

import re
import requests
from bs4 import BeautifulSoup
from urllib import request
from urllib import error


#此测试首页是否可以链接
def url_get(num_retries=5):
#    url = input("请输入要爬取的首页url:")
    url = "http://"
#    url = "http://"
    try:
        # 做一个user-agent模拟浏览器发送请求,也可以加入其它字段
        kv = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko'}
        requests.get(url, headers=kv)
        return url
    except error.URLError or error.HTTPError as e:
        if num_retries > 0:
            if hasattr(e,'code') and 500 <= e.code < 600:
                url_get(num_retries-1)
        print("url无法连接")


#此函数用于提取各链接网站下的所有链接
def spiderpage(url):
    try:
        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)
        r.encoding = r.apparent_encoding
        pagetext = r.text
        # 正则表达式表示要爬取的是
              
                 1:
                print(f"第{x-1}个url,开始爬")
            visitedurl = self.linkQuence.unvisitedurldequence()  # 从未访问列表中pop出一个url
            if visitedurl is None or visitedurl == '':
                continue
            title = getTitle(visitedurl)
            if re.findall("新华保险",title):  #如果跳出本站则pass              
                initial_links = spiderpage(visitedurl)  # 爬出该url页面中所有的链接
                right_links = url_filtrate(initial_links)  # 筛选出合格的链接
                if not right_links:
                    pass
                else:             
                    self.linkQuence.addvisitedurl(visitedurl)  # 将该url放到访问过的url队列中
                    for link in right_links:  # 将筛选出的链接放到未访问队列中
                        self.linkQuence.addunvisitedurl(link)
                    x += 1
            else:
                pass
        print(f"爬完了")
        return self.linkQuence.visited

#写文件函数
def writetofile(urllist):
    #写入网站并计数
    x=1
    for url in urllist:
        # Furls.txt用于保存链接
        file = open('Furls.txt', 'a', encoding='utf8')
        file.write(f'{url}\n')
        x += 1
    file.close()
    print(f'写入已完成,总计{x-1}个网页的子链接')

#主循环
if __name__ == '__main__':
    url = url_get()
    spider = Spider(url)
    #传入要爬取的子链接数量
    urllist = spider.crawler(5000)
    writetofile(urllist)
              
            
          

还是希望大家自己学会比较好,只是粘贴毕竟学不到东西,这个主题框架不是我写的,但是真正的实现函数都是我自己一点一点写的,遇到很多困难也都解决了,能学到不少东西。


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论