用 Python 抓取网页;分页问题

时间:2021-02-04 11:15:14

标签: python beautifulsoup jupyter-notebook screen-scraping

我仍然是初学者,所以如果这是一个愚蠢的问题,我很抱歉。我正在尝试通过 Jupyter Notebook 为我的主要分析抓取一些新文章,但我正在为分页而苦苦挣扎。我该如何解决?

代码如下:

from bs4 import BeautifulSoup
import requests
import pandas as pd

danas = []

base_url = 'https://www.danas.rs/tag/izbori-2020/page/'
r = requests.get(base_url)
c = r.content

soup = BeautifulSoup(c,"html.parser")
    
paging = soup.find("div",{"column is-8"}).find("div",{"nav-links"}).find_all("a")
start_page = paging[1].int
last_page = paging[len(paging)-1].int
web_content_list = []

for page_number in range(int(float(start_page)),int(float(last_page)) + 1):
    
    url = base_url+str(page_number)+"/.html"
    r = requests.get(base_url+str(page_number))
    c = r.content
    soup = BeautifulSoup(c,"html.parser")
    
    if r.status_code == 200:
        soup = BeautifulSoup(r.content, 'html.parser')
    
        try:
            headline = soup.find('h1', {'class': 'post-title'}).text.strip()
        except:
            headline = None
            
        try:
            time = soup.find('time', {'class': 'entry-date published'}).text.strip()[:17]
        except:
            time = None
            
        try:
            descr = soup.find('div', {'class': 'post-intro-content content'}).text.strip()
        except:
            descr = None
           
        try:
            txt = soup.find('div', {'class': 'post-content content'}).text.strip()
        except:
            txt = None
            
        # create a list with all scraped info
        danas = [headline,
                        date,
                        time,
                        descr,
                        txt]
        
        web_content_list.append(danas)
            
    else:
        print('Oh No! ' + l)
        
dh = pd.DataFrame(danas)
dh.head()

这是弹出的错误:

*AttributeError                            Traceback (most recent call last)
<ipython-input-10-1c9e3a7e6f48> in <module>
     11 soup = BeautifulSoup(c,"html.parser")
     12 
---> 13 paging = soup.find("div",{"column is-8"}).find("div",{"nav-links"}).find_all("a")
     14 start_page = paging[1].int
     15 last_page = paging[len(paging)-1].int
AttributeError: 'NoneType' object has no attribute 'find'*

1 个答案:

答案 0 :(得分:0)

嗯,一个问题是 'https://www.danas.rs/tag/izbori-2020/page/' 在初始请求时返回 Greška 404: Tražena stranica nije pronađena.。所以需要解决这个问题。

第二个问题是拉入起始页和结束页。只是好奇,你为什么要搜索起始页?所有页面都从 1 开始。

另一个问题,为什么要先转换成float,然后再转换成int。只需将页面设为 int。

第三,永远不要声明变量 date

第四,您只抓取了页面上的第一篇文章。那是你要的吗?或者你想要页面上的所有文章?我保留了您的代码,因为您的问题是指遍历页面。

5th 如果您想要文章的全文,您需要访问每个文章的链接。

代码也有一些问题。我试图发表评论,所以你可以看到它。因此,请将此代码与您的代码进行比较,如果您有任何疑问,请告诉我:

代码:

from bs4 import BeautifulSoup
import requests
import pandas as pd



base_url = 'https://www.danas.rs/tag/izbori-2020/'
r = requests.get(base_url)
c = r.text

soup = BeautifulSoup(c,"html.parser")
    
paging = soup.find("div",{"column is-8"}).find("div",{"nav-links"}).find_all("a")
start_page = 1
last_page = int(paging[1].text)
web_content_list = []

for page_number in range(int(start_page),int(last_page) + 1):
    
    url = base_url+ 'page/' + str(page_number) #<-- fixed this
    r = requests.get(url)
    c = r.text
    soup = BeautifulSoup(c,"html.parser")
    
    if r.status_code == 200:
        soup = BeautifulSoup(r.content, 'html.parser')
        articles = soup.find_all('article')
        for article in articles:
            w=1
        try:
            headline = soup.find('h2', {'class': 'article-post-title'}).text.strip()
        except:
            headline = None
            
        try:
            time = soup.find('time')['datetime']
        except:
            time = None
            
        try:
            descr = soup.find('div', {'class': 'article-post-excerpt'}).text.strip()
        except:
            descr = None
           
            
        # create a list with all scraped info   <--- changed to dictionary so that you have column:value when you create the dataframe
        danas = {'headline':headline,
                        'time':time,
                        'descr':descr}
        
        web_content_list.append(danas)
        print('Collected: %s of %s' %(page_number, last_page))
            
    else:
        #print('Oh No! ' + l) #<--- what is l? 
        print('Oh No!')
        
dh = pd.DataFrame(web_content_list) #<-- need to get the full appended list, not the danas, as thats overwritten after each iteration
dh.head()

输出:

print(dh.head().to_string())
                                                                     headline                       time                                                                                                                                                                                                                                                                                                                                                                                           descr
0                             Vučić saopštava ime mandatara vlade u 20 časova  2020-10-05T09:00:05+02:00                                                                                                                                   Predsednik Aleksandar Vučić  će u danas, nakon sastanka Predsedništva Srpske napredne stranke (SNS) saopštiti ime mandatara za sastav nove Vlade Srbije. Vučić će odluku saopštiti u 20 sati u Palati Srbija, rečeno je FoNetu u kabinetu predsednika Srbije.
1                                                 Nova skupština i nova vlada  2020-08-01T14:00:13+02:00                                                                                                                                                                        Saša Radulović biće poslanik još nekoliko dana i prvi je objavio da se vrši dezinfekcija skupštinskih prostorija, što govori u prilog tome da će se novi saziv, izabran 21. juna, ipak zakleti u Domu Narodne skupštine.
2      Brnabić o novom mandatu: To ne zavisi od mene, SNS ima dobre kandidate  2020-07-15T18:59:43+02:00                                                                                                                                                                                                                                                                              Premijerka Ana Brnabić izjavila je danas da ne zavisi od nje da li će i u novom mandatu biti na čelu Vlade Srbije.
3        Državna izborna komisija objavila prve rezultate, HDZ ubedljivo vodi  2020-07-05T21:46:56+02:00                                                                                                                                                                        Državna izborna komisija (DIP) objavila je večeras prve nepotpune rezultate po kojima vladajuća Hrvatska demokratska zajednica (HDZ) osvaja čak 69 mandata, ali je reč o rezultatima na malom broju prebrojanih glasova.
4  Analiza Pravnog tima liste „Šabac je naš“: Ozbiljni dokazi za krađu izbora  2020-07-02T10:53:57+02:00  Na osnovu izjave 123 birača, od kojih je 121 potpisana i sa matičnim brojem, prikupljenim u roku od 96 sati nakon zatvaranja biračkih mesta u nedelju 21. 6. 2020. godine u 20 časova, uočena su 263 kršenja propisa na 55 biračkih mesta, navodi se na početku Analize koju je o kršenju izbornih pravila 21. juna i uoči izbora sačinio pravni tim liste „Nebojša Zelenović – Šabac je naš“.