Hướng dẫn how do you scrape data from a list of urls in python? - làm cách nào để lấy dữ liệu từ danh sách các url trong python?

Để thực hiện một số loại bỏ nghiêm trọng, chúng tôi cần trích xuất dữ liệu nhưng cũng có URL. Trong ví dụ này, chúng tôi cho rằng bạn đã có một danh sách các URL sẵn sàng để được cạo. Chúng tôi có một mục khác nếu đó không phải là trường hợp của bạn và bạn chỉ có một hạt giống.

Có hai cách chính để đối mặt với vấn đề: xử lý các URL tuần tự hoặc song song. Chúng ta sẽ bắt đầu với phiên bản tuần tự.

Để mã hoạt động, bạn sẽ cần cài đặt Python3. Một số hệ thống có nó được cài đặt sẵn. Sau đó, cài đặt tất cả các thư viện cần thiết bằng cách chạy pip install.

pip install requests beautifulsoup4

Tuần tự

Hầu như bất kỳ lần lặp nào sẽ dẫn đến các cuộc gọi tuần tự đến API trừ khi bạn sử dụng mã Async (như JavaScript). Sử dụng Python, ví dụ, một for đơn giản sẽ là đủ trong cách tiếp cận đầu tiên.

import requests 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	print(response.text)

In kết quả không đặc biệt hữu ích, nhưng bạn nhận được điểm. Bây giờ chúng tôi sẽ bắt đầu xử lý một số nội dung. Vì vậy, chúng tôi sẽ sử dụng

import requests 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	print(response.text)
0 để trích xuất tiêu đề của trang. Hãy coi đó là một trình giữ chỗ cho logic chiết xuất bạn cần.

from bs4 import BeautifulSoup 
# ... 
def extract_content(soup): 
	print(soup.title.string) 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	soup = BeautifulSoup(response.text, "html.parser") 
	extract_content(soup)

Trong

import requests 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	print(response.text)
1, bạn có thể điền bất cứ thứ gì bạn cần từ nội dung của trang. Bạn có thể tạo các đối tượng với dữ liệu được trích xuất và tích lũy chúng để xử lý sau này. Điều đó có vấn đề rằng dữ liệu có thể bị mất nếu có vấn đề với tập lệnh và nó làm hỏng quy trình. Không có kiểm soát lỗi trong đoạn trích để đơn giản nhưng tính đến nó để viết mã sản xuất. Đây là một ví dụ về một trình trích xuất đơn giản.

def extract_content(url, soup): 
	return { 
		"url": url, 
		"title": soup.title.string, 
		"h2": soup.find("h2").text, 
	}

Mọi thứ kết hợp lại với nhau:

import requests 
from bs4 import BeautifulSoup 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
def extract_content(url, soup): 
	return { 
		"url": url, 
		"title": soup.title.string, 
		"h2": soup.find("h2").text, 
	} 
 
results = [] 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	soup = BeautifulSoup(response.text, "html.parser") 
	results.append(extract_content(url, soup)) 
 
print(results)

Song song

Mã trên hoạt động tốt cho một bộ URL nhỏ. Nhưng khi chúng ta phát triển, chúng ta muốn song song hóa càng nhiều càng tốt. Điều đó có nghĩa là việc gửi hai yêu cầu đồng thời sẽ (ít nhiều) chia tổng thời gian thành hai.

Vậy tại sao không gửi tất cả các yêu cầu cùng một lúc? Các hệ thống thường có số lượng tối đa các yêu cầu đồng thời. Zenrows có tối đa tùy thuộc vào kế hoạch bạn đang tham gia. Chúng ta hãy thực hiện mười yêu cầu đồng thời cho bài kiểm tra.

Mã cho các yêu cầu song song sẽ liên quan trực tiếp đến ngôn ngữ được sử dụng thay vì liên tiếp, nói chung hơn. Chúng tôi sẽ sử dụng Python vì nó là phổ biến và Zenrows Python SDK, đi kèm với sự đồng thời ngoài hộp. Hãy hỏi chúng tôi về các phiên bản khác nhau nếu quan tâm.

Điều đầu tiên chúng ta cần giới thiệu là Thư viện Asyncio.

import requests 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	print(response.text)
2 của nó sẽ chờ tất cả các cuộc gọi kết thúc. Sau đó, chúng tôi có thể yêu cầu URL với
import requests 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	print(response.text)
3.

Trong nội bộ, SKD tạo ra một nhóm với số lượng quy trình tối đa. Nó sẽ xử lý sự sẵn có của mỗi công nhân và đảm bảo rằng các nhiệm vụ được xử lý càng sớm càng tốt. Và, đồng thời, không bao giờ vượt quá mức tối đa trước đó.

from zenrows import ZenRowsClient 
import asyncio 
from bs4 import BeautifulSoup 
 
client = ZenRowsClient("YOUR_KEY", concurrency=5, retries=1) 
 
urls = [ 
	# ... 
] 
 
async def call_url(url): 
	try: 
		response = await client.get_async(url) 
		if (response.ok): 
			soup = BeautifulSoup(response.text, "html.parser") 
			return { 
				"url": url, 
				"title": soup.title.string, 
				"h2": soup.find("h2").text, 
			} 
	except Exception as e: 
		pass 
 
async def main(): 
	results = await asyncio.gather(*[call_url(url) for url in urls]) 
	print(results) 
 
asyncio.run(main())

Chúng tôi đã không thực hiện xử lý lỗi thích hợp vì lợi ích của Clarity. Nếu có bất kỳ lỗi hoặc ngoại lệ nào,

import requests 
 
zenrows_api_base = "https://api.zenrows.com/v1/?apikey=YOUR_KEY" 
urls = [ 
	# ... your URLs here 
] 
 
for url in urls: 
	response = requests.get(zenrows_api_base, params={"url": url}) 
	print(response.text)
4 sẽ là kết quả.

Chúng tôi có một bài viết khác về cách xử lý đồng thời với các ví dụ trong JavaScript.

Tôi đang cố gắng sử dụng BeautifulSoup4 trong Orange để cạo dữ liệu từ danh sách các URL được cạo từ cùng một trang web.

Tôi đã quản lý để xóa dữ liệu từ một trang khi tôi đặt URL theo cách thủ công.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import csv
import re

url = "https://data.ushja.org/awards-standings/zone-points.aspx?year=2021&zone=1§ion=1901"
req = requests.get(url)
soup = BeautifulSoup(req.text, "html.parser")

rank = soup.find("table", class_="table-standings-body")
for child in rank.children:
    print(url,child)

Và tôi đã có thể loại bỏ danh sách các URL tôi cần

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import csv
import re

url = "https://data.ushja.org/awards-standings/zones.aspx?year=2021&zone=1"
req = requests.get(url)
soup = BeautifulSoup(req.text, "html.parser")

rank = soup.find("table", class_="table-standings-body")

link = soup.find('div',class_='contentSection')

url_list = link.find('a').get('href')
for url_list in link.find_all('a'):
    print (url_list.get('href'))

Nhưng cho đến nay tôi vẫn chưa thể kết hợp cả hai để xóa dữ liệu khỏi danh sách URL đó. Tôi có thể làm điều đó chỉ bằng cách làm tổ for vòng lặp, và nếu vậy, làm thế nào? Hoặc làm thế nào tôi có thể làm điều đó?

Tôi xin lỗi nếu đây là một câu hỏi ngu ngốc, nhưng tôi chỉ bắt đầu thử với Python và Web-Scraping ngày hôm qua và tôi đã không thể tìm ra điều này bằng cách tham khảo các chủ đề tương tự.

Làm thế nào để bạn cạo dữ liệu từ một danh sách các URL?

Để cạo bằng cách sử dụng danh sách các URL, chúng tôi chỉ cần thiết lập một vòng lặp của tất cả các URL chúng tôi cần cạo từ sau đó thêm hành động trích xuất dữ liệu ngay sau khi lấy dữ liệu chúng tôi cần. Octopars sẽ tải từng URL và xóa dữ liệu từ mỗi trang.set up a loop of all the URLs we need to scrape from then add a data extraction action right after it to get the data we need. Octoparse will load the URLs one by one and scrape the data from each page.

Làm cách nào để xóa dữ liệu từ nhiều URL?

Kéo một hành động vòng lặp vào quy trình làm việc ..
Chọn danh sách của chế độ URL của URL ..
Nhập/dán danh sách các URL bạn muốn cạo vào hộp văn bản ..
Đừng quên nhấp vào OK và lưu nút ..

Làm thế nào để bạn cạo dữ liệu từ nhiều trang web trong Python?

Cạo nhiều trang của một trang web bằng Python..
Chúng tôi sẽ nhập tất cả các thư viện cần thiết ..
Thiết lập chuỗi URL của chúng tôi để tạo kết nối bằng thư viện yêu cầu ..
Phân tích dữ liệu có sẵn từ trang đích bằng trình phân tích cú pháp của Thư viện BeautifulSoup ..

Làm cách nào để trích xuất văn bản từ nhiều URL trong Python?

Đầu tiên lưu các URL bạn muốn trong tệp văn bản 2. Đọc tệp và vòng lặp python trên các URL và trích xuất văn bản.3. đổ tất cả nội dung bằng cách ghi vào một tệp (mỗi dòng một tài liệu) 4.