简体   繁体   English

使用python抓取多个页面

[英]Scraping multiple pages with python

I'm trying to scrape a multiple page website with beautiful soup. 我正在尝试用漂亮的汤刮一个多页的网站。 The code works partially. 该代码部分起作用。 It returns only the last one page instead of all pages. 它仅返回最后一页而不是所有页面。 How can I fix the problem? 我该如何解决该问题?

# 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)

Just put the final lines of code that are outside the for-loop inside the for-loop so they are run for every page. 只需将位于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)

There is nothing wrong with the way you have already tried except for the indentation. 除了缩进,您已经尝试过的方法没有任何问题。 However, alternative approach could be something like below: 但是,替代方法可能如下所示:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM