首页 > 解决方案 > 使用 python 从 url 列表中抓取网页

问题描述

我正在尝试从列表中抓取一些列表属性网站。我编写了简单的代码来从一个 url 获取数据,但是当我尝试使用 list ['url1','url2'] 时,我没有任何结果。我也在尝试使用 csv 列表,但我仍然一无所有。我检查了很多类似的主题,但结果仍然是空的。你能帮我理解怎么做吗?

'''

import lxml
import requests
import pandas as pd
from bs4 import BeautifulSoup

url = 'https://www.zillow.com/homedetails/105-Itasca-St-Boston-MA-02126/59137872_zpid/'
response = requests.get(url)
req_headers = {
    'accept': 
    'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.8',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like 
    Gecko) Chrome/61.0.3163.100 Safari/537.36'
}

with requests.Session() as s:
url 
r = s.get(url, headers=req_headers)
soup = BeautifulSoup(r.content, 'lxml')

price = soup.find('span', {'class': 'ds-value'}).text
property_type = soup.find('span', {'class': 'ds-home-fact-value'}).text
address = soup.find('h1', {'class': 'ds-address-container'}).text

price, property_type, address '''

标签: pythonweb-scraping

解决方案


要完成您对多个 url 的要求,您需要做的就是将它们放在一个列表中并对其进行迭代:

import requests
from bs4 import BeautifulSoup

urls = [
    'https://www.zillow.com/homedetails/105-Itasca-St-Boston-MA-02126/59137872_zpid/',
]

with requests.Session() as s:
    for url in urls:
        r = s.get(url)
        soup = BeautifulSoup(r.text, 'html.parser')

        # do something with soup

但是,这里的主要问题是您的示例网页上几乎所有有趣的东西似乎都是由 JavaScript 生成的。例如,如果您:

print(soup.body)

您将看到该网页的 html 正文几乎没有(没有价格、没有房屋详细信息等),除了用于验证您是人类的验证码机制。您需要找到一种方法来等待 JavaScript 在页面上呈现,以便能够抓取详细信息。查看 python 模块selenium作为实现此目的的潜在解决方法。


推荐阅读