【问题标题】:How to use "for" to "loop" multiple urls while webscraping? [closed]网络抓取时如何使用 \"for\" 来 \"循环\" 多个 url? [关闭]
【发布时间】:2023-02-06 06:51:17
【问题描述】:

当前的代码非常适合仅抓取一个 Url 的信息,我希望能够一次从多个 URL 抓取(可能使用 For url in Urls),这是下面仅一个 URL 的当前代码。请提供任何帮助或指导,我们将不胜感激

import datetime
from bs4 import BeautifulSoup
import requests

def get_url_data_from_url_request(url):
 print(">> get_url_data_from_url_request: "+str(url))
 url_data = None
 headers = {"user-agent": "Mozilla/5.0 (Windows NT 
 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like 
 Gecko) Chrome/90.0.4430.93 Safari/537.36"}
 s = requests.session()
 s.keep_alive = False
 request = s.get(url, proxies=None, headers=headers)
 print("request.status_code: ", request.status_code )
 url_data = request.text
 request.connection.close()
 s.close()
 return url_data

def main():
 print("bdr.sandbox")
 generated_on = datetime.datetime.now()
 print(generated_on)
 source_product_url = ""
 url_data = get_url_data_from_url_request(url=source_product_url)
 soup = BeautifulSoup(url_data, "lxml")
 id_element = soup.find('span', {"itemprop": "sku"}).text
 print(id_element)
 
if __name__ == '__main__':
main()

【问题讨论】:

  • 那么使用for循环有什么问题呢?
  • 欢迎来到堆栈溢出。很难理解这个问题,因为它不清楚为什么有问题.例如,你知道如何使用 for 循环吗?对于其他事情?如果是这样,那么为什么将它用于此任务会出现问题?如果您不知道,那么 - 首先,您怎么知道有 for 循环这样的东西?因为你在某个地方读过它,对吧?您是否尝试返回那里并阅读更多内容以了解如何使用它?

标签: python json loops web-scraping beautifulsoup


【解决方案1】:

有无数种方法可以做到;这是一个示例:在 main 中参数化 source_product_url 并在循环中调用它。 (如果您想保存数据以供将来使用,请添加return id_element。)

def get_sku(source_product_url):
 print("bdr.sandbox")
 generated_on = datetime.datetime.now()
 print(generated_on) 
 url_data = get_url_data_from_url_request(url=source_product_url)
 soup = BeautifulSoup(url_data, "lxml")
 id_element = soup.find('span', {"itemprop": "sku"}).text
 print(id_element)
 return id_element

此时你可以只做for url in urlsList: get_sku(url),但是如果你想收集一些数据[并且还要确保,即使在抓取某些页面时出现任何错误,程序仍然会尝试抓取其余部分],然后你可以做类似的事情

def try_get_sku(srcProdUrl):
 try: return {'source_product_url': srcProdUrl, 'sku': get_sku(srcProdUrl)}
 except Exception as e:
  errorMsg = f'{type(e)} {e}'
  print(f'failed to scrape {srcProdUrl} 
 ', errorMsg)
  return {'source_product_url': srcProdUrl, 'errorMsg': errorMsg} 

(这也方便list comprehension

def main():
 spUrls = [
  'https://www.6pm.com/p/easy-spirit-epic-gray/product/9450972/color/11',
  ## ADD ALL URLS TO SCRAPE ##
 ]
 productsInfo = [try_get_sku(spUrls) for url in spUrls]
 # do something with productsInfo if you want to, like
 # pandas.DataFrame(productsInfo).to_csv('productsInfo.csv') # saves in csv file [import pandas]

【讨论】:

  • 非常感谢,您是唯一理解我的问题并给了我正确答案的人。我真的很感激。
  • @nesqluck 很高兴为您提供帮助!如果这个(或任何其他)答案令人满意地解决了您的问题,请通过单击它左上角的复选标记按钮来标记 as accepted
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2020-06-24
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2016-06-25
相关资源
最近更新 更多