Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用bs4制作抓取网站的爬虫_Python_Python 3.x_Web Scraping_Beautifulsoup_Request - Fatal编程技术网

Python 如何用bs4制作抓取网站的爬虫

Python 如何用bs4制作抓取网站的爬虫,python,python-3.x,web-scraping,beautifulsoup,request,Python,Python 3.x,Web Scraping,Beautifulsoup,Request,我写了一个脚本来删去引用和作者的名字。 在这个项目中,我使用请求获取页面的代码,并使用bs4解析HTML。 我使用while循环遍历分页链接到下一页,但我希望代码在没有剩余页面时停止运行。 我的代码可以工作,但它不会停止运行 这是我的密码: from bs4 import BeautifulSoup as bs import requests def scrape(): page = 1 url = 'http://quotes.toscrape.com' r = re

我写了一个脚本来删去引用和作者的名字。 在这个项目中,我使用请求获取页面的代码,并使用bs4解析HTML。 我使用while循环遍历分页链接到下一页,但我希望代码在没有剩余页面时停止运行。 我的代码可以工作,但它不会停止运行

这是我的密码:

from bs4 import BeautifulSoup as bs
import requests

def scrape():
    page = 1
    url = 'http://quotes.toscrape.com'
    r = requests.get(url)
    soup = bs(r.text,'html.parser')
    quotes = soup.find_all('span',attrs={"class":"text"})
    authors = soup.find_all('small',attrs={"class":"author"})
    p_link = soup.find('a',text="Next")

    condition = True
    while condition:
        with open('quotes.txt','a') as f:
            for i in range(len(authors)):
                f.write(quotes[i].text+' '+authors[i].text+'\n')
        if p_link not in soup:
            condition = False
            page += 1
            url = 'http://quotes.toscrape.com/page/{}'.format(page)
            r = requests.get(url)
            soup = bs(r.text,'html.parser')
            quotes = soup.find_all('span',attrs={"class":"text"})
            authors = soup.find_all('small',attrs={"class":"author"})
            condition = True
        else:
            condition = False

    print('done')


scrape()

因为
p_link
从来都不是汤。我发现两个原因

  • 您可以使用文本“下一步”进行搜索。但似乎实际情况是这样的 链接为“下一步”+空格+右箭头

  • 标记包含指向下一页的属性“href”。 对于每个页面,这将具有不同的值

  • 在第一个if块的while循环中,使条件为False也没有区别。不管怎么说,你都是把它放回了街区的尽头

    所以

    使用以下命令代替“按下一步搜索”:

    soup.find('li',attrs={“class”:“next”})

    对于这种情况,使用:

    if soup.find('li',attrs={"class":"next"}) is None:
       condition = False
    
    最后,如果你想写最后一页的引文,我建议你把“写入文件”部分放在最后。或者完全避免它。如下所示:

    from bs4 import BeautifulSoup as bs
    import requests
    
    def scrape():
        page = 1
        while True:
    
            if page == 1:
                url = 'http://quotes.toscrape.com'
            else:
                url = 'http://quotes.toscrape.com/page/{}'.format(page)
    
            r = requests.get(url)
            soup = bs(r.text,'html.parser')
    
            quotes = soup.find_all('span',attrs={"class":"text"})
            authors = soup.find_all('small',attrs={"class":"author"})
    
            with open('quotes.txt','a') as f:
                for i in range(len(authors)):
                    f.write(str(quotes[i].encode("utf-8"))+' '+str(authors[i].encode("utf-8"))+'\n')       
    
            if soup.find('li',attrs={"class":"next"}) is None:
                break
    
            page+=1
    
        print('done')
    
    
    scrape()
    

    因为
    p_link
    从来都不是汤。我发现两个原因

  • 您可以使用文本“下一步”进行搜索。但似乎实际情况是这样的 链接为“下一步”+空格+右箭头

  • 标记包含指向下一页的属性“href”。 对于每个页面,这将具有不同的值

  • 在第一个if块的while循环中,使条件为False也没有区别。不管怎么说,你都是把它放回了街区的尽头

    所以

    使用以下命令代替“按下一步搜索”:

    soup.find('li',attrs={“class”:“next”})

    对于这种情况,使用:

    if soup.find('li',attrs={"class":"next"}) is None:
       condition = False
    
    最后,如果你想写最后一页的引文,我建议你把“写入文件”部分放在最后。或者完全避免它。如下所示:

    from bs4 import BeautifulSoup as bs
    import requests
    
    def scrape():
        page = 1
        while True:
    
            if page == 1:
                url = 'http://quotes.toscrape.com'
            else:
                url = 'http://quotes.toscrape.com/page/{}'.format(page)
    
            r = requests.get(url)
            soup = bs(r.text,'html.parser')
    
            quotes = soup.find_all('span',attrs={"class":"text"})
            authors = soup.find_all('small',attrs={"class":"author"})
    
            with open('quotes.txt','a') as f:
                for i in range(len(authors)):
                    f.write(str(quotes[i].encode("utf-8"))+' '+str(authors[i].encode("utf-8"))+'\n')       
    
            if soup.find('li',attrs={"class":"next"}) is None:
                break
    
            page+=1
    
        print('done')
    
    
    scrape()