m0_69693998 2023-04-11 15:42 采纳率: 77.8%
浏览 15
已结题

在网上搜索都说是缺少http,但是我的是完整的啊root_url = '而且每次运行引号里面的单个字母要不然就是a

python3.2
requests.exceptions.MissingSchema: Invalid URL 'a': No scheme supplied. Perhaps you meant https://a/?

这是什么意思,在网上搜索都说是缺少http,或者代码不完全,但是我的是完整的啊root_url = 'http://www.baidu.com%27/
而且每次运行引号里面的单个字母要不然就是a,h,y还有/,帮帮忙,卡了一周了

爬虫部分

import re
from ruan.uilts import url_manager
import requests
from bs4 import BeautifulSoup

#设置入口
root_url = 'http://www.baidu.com'

urls=url_manager.urlmanager()
urls.add_new_urls(root_url)
fout=open("craw_all_pages.text","w")
while urls.has_new_url():
    curr_url=urls.get_url()
    r = requests.get(curr_url,timeout=3)
    if r.status_code !=200:
        print("error,return status_code is not 200",curr_url)
        continue
    soup=BeautifulSoup(r.text,"html_parser")
    title=soup.title.string

    fout.write("%s\t%s\n"%(curr_url.title))
    print("succes:%s,%s,%s"%(curr_url.title,len(urls.new_urls)))

    links= soup.find_all('a')
    for link in links:
        href=link["href"]
        if href is None:
            continue
        pattern=r'^http://www.crazyant.net/\d+.html$'
        if re.match(pattern,href):
            urls.add_new_url(href)

fout.close()

url_manager部分


class urlmanager():
    def __init__(self):
        self.new_urls=set()#定义带爬取的url容器
        self.old_urls=set()#定义已经被爬取的url容器

    def add_new_url(self,url):#添加单个url
        if url is None or len(url)==0:
            return
        if url in self.new_urls or url in self.old_urls:#判断url是否再新添加url里面或者再旧的url里面,都表示存在都返回
            return
        self.new_urls.add(url)
    def add_new_urls(self,urls):#添加的url的集合,从中判断是否为新的或者旧的。新的添加入new_urls,反之添加入old_urls
        if urls is None or len(urls)==0:
            return
        for url in urls:
            self.add_new_url(url)

    def get_url(self):
        if self.has_new_url():
            url=self.new_urls.pop()#pop方法可以从一个集合中移除一个元素并且返回
            self.old_urls.add(url)#将移除的url标记成旧的url
            return url
    def has_new_url(self):#判断容器中是否还有url待爬取
        return  len(self.new_urls) > 0







  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2023-04-11 16:08
    关注

    urls.add_new_urls(root_url)
    这一句有问题,相当于你把一个字符串传进去,然后再通过类方法把字符串拆成了一个个字符,所以后面访问的都是一个个字符为名称的URL

        def add_new_urls(self,urls):#添加的url的集合,从中判断是否为新的或者旧的。新的添加入new_urls,反之添加入old_urls
            if urls is None or len(urls)==0:
                return
            for url in urls:
                self.add_new_url(url)
    

    三种方式可以改:
    1,把root_url改成列表:root_url = ['http://www.baidu.com%27/]
    2,传入的参数使用列表:urls.add_new_urls([root_url])
    3,类方法使用不定长形参(加个星号):def add_new_urls(self,*urls):

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 修改了问题 4月11日
  • 修改了问题 4月11日
  • 展开全部

悬赏问题

  • ¥15 我的数据无法存进链表里
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端