使用python抓取多个页面

时间:2018-09-02 20:03:09

标签: python web-scraping beautifulsoup

我正试图用漂亮的汤刮一个多页的网站。该代码部分起作用。它仅返回最后一页而不是所有页面。如何解决该问题?

# import libraries
import urllib.request
from bs4 import BeautifulSoup

# specify the url
aziende = [
'35-azienda-4_planets', '36-azienda-archivio_23', '24-azienda-bm', '16-azienda-brolese_virginio', '39-azienda-castellani', '19-azienda-centro_ottico_bisa', '25-azienda-comel_optik', '37-azienda-de_lorenzo_occhiali', '15-azienda-delta_laser', '34-azienda-dem', '21-azienda-erizzo', '3-azienda-evo', '27-azienda-farben_occhialeria', '32-azienda-gio__eyewear', '7-azienda-gipizeta', '42-azienda-h8', '20-azienda-idea_91', '5-azienda-lem', '41-azienda-lasertec', '22-azienda-le_thi_thu_thu', '28-azienda-m1', '1-azienda-mati_', '38-azienda-metal_dream', '30-azienda-mictu', '23-azienda-nete', '10-azienda-new_italian_design_eyewear', '31-azienda-okki_lux', '9-azienda-ottica_pra_floriani', '12-azienda-pao', '40-azienda-palladio_occhiali', '29-azienda-plastil_due', '17-azienda-punti_di_vista', '14-azienda-quemme', '4-azienda-red_line', '43-azienda-revert', '33-azienda-sm', '6-azienda-scussel', '8-azienda-sistem', '18-azienda-stile_italiano', '26-azienda-tecnodanta', '11-azienda-toffoli_costantino', '13-azienda-tri_color', '2-azienda-zago'
        ]
for azienda in aziende:
    page_link = 'http://www.occhialeriabellunotreviso.it/' + azienda
    page = urllib.request.urlopen(page_link ) # query the website and return the html to the variable ‘page’
    soup = BeautifulSoup(page, 'html.parser') # parse the html using beautiful soup and store in variable `soup`



# Take out the <div> of name and get its value
name_box = soup.find('h2')

name = name_box.text.strip() # strip() is used to remove starting and trailing
print (name)

2 个答案:

答案 0 :(得分:2)

只需将位于for循环内的最后几行代码放入for循环内,以便它们在每个页面上运行。

# import libraries
import urllib.request
from bs4 import BeautifulSoup

# specify the url
aziende = [
'35-azienda-4_planets', '36-azienda-archivio_23', '24-azienda-bm', '16-azienda-brolese_virginio', '39-azienda-castellani', '19-azienda-centro_ottico_bisa', '25-azienda-comel_optik', '37-azienda-de_lorenzo_occhiali', '15-azienda-delta_laser', '34-azienda-dem', '21-azienda-erizzo', '3-azienda-evo', '27-azienda-farben_occhialeria', '32-azienda-gio__eyewear', '7-azienda-gipizeta', '42-azienda-h8', '20-azienda-idea_91', '5-azienda-lem', '41-azienda-lasertec', '22-azienda-le_thi_thu_thu', '28-azienda-m1', '1-azienda-mati_', '38-azienda-metal_dream', '30-azienda-mictu', '23-azienda-nete', '10-azienda-new_italian_design_eyewear', '31-azienda-okki_lux', '9-azienda-ottica_pra_floriani', '12-azienda-pao', '40-azienda-palladio_occhiali', '29-azienda-plastil_due', '17-azienda-punti_di_vista', '14-azienda-quemme', '4-azienda-red_line', '43-azienda-revert', '33-azienda-sm', '6-azienda-scussel', '8-azienda-sistem', '18-azienda-stile_italiano', '26-azienda-tecnodanta', '11-azienda-toffoli_costantino', '13-azienda-tri_color', '2-azienda-zago'
        ]
for azienda in aziende:
    page_link = 'http://www.occhialeriabellunotreviso.it/' + azienda
    page = urllib.request.urlopen(page_link ) # query the website and return the html to the variable ‘page’
    soup = BeautifulSoup(page, 'html.parser') # parse the html using beautiful soup and store in variable `soup`

    # Take out the <div> of name and get its value
    name_box = soup.find('h2')

    name = name_box.text.strip() # strip() is used to remove starting and trailing
    print (name)

答案 1 :(得分:2)

除了缩进,您已经尝试过的方法没有任何问题。但是,替代方法可能如下所示:

import urllib.request
from bs4 import BeautifulSoup

link = 'http://www.occhialeriabellunotreviso.it/{}'

aziende = (
        '35-azienda-4_planets', '36-azienda-archivio_23', '24-azienda-bm', '16-azienda-brolese_virginio', '39-azienda-castellani', '19-azienda-centro_ottico_bisa', '25-azienda-comel_optik', '37-azienda-de_lorenzo_occhiali', '15-azienda-delta_laser', '34-azienda-dem', '21-azienda-erizzo', '3-azienda-evo', '27-azienda-farben_occhialeria', '32-azienda-gio__eyewear', '7-azienda-gipizeta', '42-azienda-h8', '20-azienda-idea_91', '5-azienda-lem', '41-azienda-lasertec', '22-azienda-le_thi_thu_thu', '28-azienda-m1', '1-azienda-mati_', '38-azienda-metal_dream', '30-azienda-mictu', '23-azienda-nete', '10-azienda-new_italian_design_eyewear', '31-azienda-okki_lux', '9-azienda-ottica_pra_floriani', '12-azienda-pao', '40-azienda-palladio_occhiali', '29-azienda-plastil_due', '17-azienda-punti_di_vista', '14-azienda-quemme', '4-azienda-red_line', '43-azienda-revert', '33-azienda-sm', '6-azienda-scussel', '8-azienda-sistem', '18-azienda-stile_italiano', '26-azienda-tecnodanta', '11-azienda-toffoli_costantino', '13-azienda-tri_color', '2-azienda-zago'
    )

def get_item(url):
    for azienda in aziende:
        page = urllib.request.urlopen(url.format(azienda))
        soup = BeautifulSoup(page, 'html.parser')
        name_box = soup.find('h2').get_text(strip=True)
        yield name_box

if __name__ == '__main__':
    for item in get_item(link):
        print(item)