Có vẻ tốt như cách tiếp cận thu thập dữ liệu này, nó được nhiều trang web cau mày và có những hậu quả để theo dõi với việc cạo, giống như lệnh cấm trên IP của chúng tôi.
Trên một lưu ý tích cực, các dịch vụ proxy giúp tránh hậu quả này. Chúng cho phép chúng tôi đảm nhận một IP khác trong khi thu thập dữ liệu trực tuyến và có vẻ an toàn như điều này, sử dụng nhiều proxy là tốt hơn. Sử dụng nhiều proxy trong khi cào làm cho sự tương tác với trang web xuất hiện ngẫu nhiên và tăng cường bảo mật.
Trang web mục tiêu (nguồn) cho hướng dẫn này là một hiệu sách trực tuyến. Nó bắt chước một trang web thương mại điện tử cho sách. Trên đó là những cuốn sách có tên, giá cả và tính khả dụng. Vì hướng dẫn này không tập trung vào việc tổ chức dữ liệu được trả về mà là các proxy xoay, dữ liệu được trả về sẽ chỉ được trình bày trong bảng điều khiển.
Cài đặt và nhập một số mô -đun Python vào tệp của chúng tôi trước khi chúng tôi có thể bắt đầu mã hóa các chức năng sẽ hỗ trợ xoay chuyển các proxy và cạo trang web.
pip install requests beautifulSoup4 lxml
3 trong số 5 mô -đun Python cần thiết cho tập lệnh cạo này có thể được cài đặt bằng lệnh trên. Yêu cầu cho phép chúng tôi gửi yêu cầu HTTP đến Trang web, BeautifulSoup4 cho phép chúng tôi trích xuất thông tin từ trang HTML được cung cấp bởi các yêu cầu và LXML là trình phân tích cú pháp HTML.
Ngoài ra, chúng tôi cũng cần mô-đun luồng tích hợp để cho phép nhiều thử nghiệm các proxy để xem liệu chúng có hoạt động và JSON đọc từ tệp JSON không.
import requests
import threading
from requests.auth import HTTPProxyAuth
import json
from bs4 import BeautifulSoup
import lxml
import time
url_to_scrape = "https://books.toscrape.com"
valid_proxies = []
book_names = []
book_price = []
book_availability = []
next_button_link = ""
Xây dựng một tập lệnh quét xoay các proxy có nghĩa là chúng ta cần một danh sách các proxy để lựa chọn trong quá trình xoay. Một số proxy yêu cầu xác thực, và những người khác thì không. Chúng ta phải tạo một danh sách các từ điển với các chi tiết proxy, bao gồm tên người dùng và mật khẩu proxy nếu cần xác thực.
Cách tiếp cận tốt nhất cho điều này là đưa thông tin proxy của chúng tôi vào một tệp JSON riêng biệt được tổ chức như cái dưới đây:
[
{
"proxy_address": "XX.X.XX.X:XX",
"proxy_username": "",
"proxy_password": ""
},
{
"proxy_address": "XX.X.XX.X:XX",
"proxy_username": "",
"proxy_password": ""
},
{
"proxy_address": "XX.X.XX.X:XX",
"proxy_username": "",
"proxy_password": ""
},
{
"proxy_address": "XX.X.XX.X:XX",
"proxy_username": "",
"proxy_password": ""
}
]
Trong trường proxy_address, nhập địa chỉ IP và cổng, cách nhau bởi một dấu hai chấm. Trong các trường proxy_username và các trường proxy_password, cung cấp tên người dùng và mật khẩu để ủy quyền.
Trên đây là nội dung của tệp JSON với 4 proxy cho tập lệnh chọn. Tên người dùng và mật khẩu có thể trống, cho biết proxy không yêu cầu xác thực.
def verify_proxies(proxy:dict):
try:
if proxy['proxy_username'] != "" and proxy['proxy_password'] != "":
proxy_auth = HTTPProxyAuth(proxy['proxy_username'], proxy['proxy_password'])
res = requests.get(
url_to_scrape,
auth = proxy_auth,
proxies={
"http" : proxy['proxy_address']
}
)
else:
res = requests.get(url_to_scrape, proxies={
"http" : proxy['proxy_address'],
})
if res.status_code == 200:
valid_proxies.append(proxy)
print(f"Proxy Validated: {proxy['proxy_address']}")
except:
print("Proxy Invalidated, Moving on")
Để đề phòng, chức năng này đảm bảo rằng các proxy được cung cấp đang hoạt động và hoạt động. Chúng tôi có thể đạt được điều này bằng cách lặp qua từng từ điển trong tệp JSON, gửi yêu cầu nhận đến trang web và nếu mã trạng thái 200 được trả về, sau đó thêm proxy đó vào danh sách các biến đổi - một biến chúng tôi đã tạo trước đó để lưu giữ proxy làm việc từ danh sách trong tệp. Nếu cuộc gọi không thành công, việc thực hiện tiếp tục.
Vì BeautifulSoup cần mã HTML của trang web để trích xuất dữ liệu chúng tôi cần, chúng tôi đã tạo request_function (), lấy URL và proxy lựa chọn và trả về mã HTML làm văn bản. Biến proxy cho phép chúng tôi định tuyến yêu cầu thông qua các proxy khác nhau, do đó xoay proxy.
def request_function(url, proxy):
try:
if proxy['proxy_username'] != "" and proxy['proxy_password'] != "":
proxy_auth = HTTPProxyAuth(proxy['proxy_username'], proxy['proxy_password'])
response = requests.get(
url,
auth = proxy_auth,
proxies={
"http" : proxy['proxy_address']
}
)
else:
response = requests.get(url, proxies={
"http" : proxy['proxy_address']
})
if response.status_code == 200:
return response.text
except Exception as err:
print(f"Switching Proxies, URL access was unsuccessful: {err}")
return None
data_extract () trích xuất dữ liệu chúng ta cần từ mã HTML được cung cấp. Nó thu thập phần tử HTML chứa thông tin sách như tên sách, giá cả và tính khả dụng. Nó cũng trích xuất liên kết cho trang tiếp theo.
Điều này đặc biệt khó khăn vì liên kết là động, vì vậy chúng tôi phải giải thích cho sự năng động. Cuối cùng, nó xem qua các cuốn sách và trích xuất tên, giá cả và tính khả dụng, sau đó trả về liên kết nút tiếp theo mà chúng tôi sẽ sử dụng để lấy mã HTML của trang tiếp theo.
def data_extract(response):
soup = BeautifulSoup(response, "lxml")
books = soup.find_all("li", class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
next_button_link = soup.find("li", class_="next").find('a').get('href')
next_button_link=f"{url_to_scrape}/{next_button_link}" if "catalogue" in next_button_link else f"{url_to_scrape}/catalogue/{next_button_link}"
for each in books:
book_names.append(each.find("img").get("alt"))
book_price.append(each.find("p", class_="price_color").text)
book_availability.append(each.find("p", class_="instock availability").text.strip())
return next_button_link
Để liên kết mọi thứ với nhau, chúng tôi phải:
with open("proxy-list.json") as json_file:
proxies = json.load(json_file)
for each in proxies:
threading.Thread(target=verify_proxies, args=(each, )).start()
time.sleep(4)
for i in range(len(valid_proxies)):
response = request_function(url_to_scrape, valid_proxies[i])
if response != None:
next_button_link = data_extract(response)
break
else:
continue
for proxy in valid_proxies:
print(f"Using Proxy: {proxy['proxy_address']}")
response = request_function(next_button_link, proxy)
if response is not None:
next_button_link = data_extract(response)
else:
continue
for each in range(len(book_names)):
print(f"No {each+1}: Book Name: {book_names[each]} Book Price: {book_price[each]} and Availability {book_availability[each]}")
import requests
import threading
from requests.auth import HTTPProxyAuth
import json
from bs4 import BeautifulSoup
import time
url_to_scrape = "https://books.toscrape.com"
valid_proxies = []
book_names = []
book_price = []
book_availability = []
next_button_link = ""
def verify_proxies(proxy: dict):
try:
if proxy['proxy_username'] != "" and proxy['proxy_password'] != "":
proxy_auth = HTTPProxyAuth(proxy['proxy_username'], proxy['proxy_password'])
res = requests.get(
url_to_scrape,
auth=proxy_auth,
proxies={
"http": proxy['proxy_address'],
}
)
else:
res = requests.get(url_to_scrape, proxies={
"http": proxy['proxy_address'],
})
if res.status_code == 200:
valid_proxies.append(proxy)
print(f"Proxy Validated: {proxy['proxy_address']}")
except:
print("Proxy Invalidated, Moving on")
# Lấy phần tử HTML của trang
def request_function(url, proxy):
try:
if proxy['proxy_username'] != "" and proxy['proxy_password'] != "":
proxy_auth = HTTPProxyAuth(proxy['proxy_username'], proxy['proxy_password'])
response = requests.get(
url,
auth=proxy_auth,
proxies={
"http": proxy['proxy_address'],
}
)
else:
response = requests.get(url, proxies={
"http": proxy['proxy_address'],
})
if response.status_code == 200:
return response.text
except Exception as err:
print(f"Switching Proxies, URL access was unsuccessful: {err}")
return None
# Cào
def data_extract(response):
soup = BeautifulSoup(response, "lxml")
books = soup.find_all("li", class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
next_button_link = soup.find("li", class_="next").find('a').get('href')
next_button_link = f"{url_to_scrape}/{next_button_link}" if "catalogue" in next_button_link else f"{url_to_scrape}/catalogue/{next_button_link}"
for each in books:
book_names.append(each.find("img").get("alt"))
book_price.append(each.find("p", class_="price_color").text)
book_availability.append(each.find("p", class_="instock availability").text.strip())
return next_button_link
# Nhận proxy từ JSON
with open("proxy-list.json") as json_file:
proxies = json.load(json_file)
for each in proxies:
threading.Thread(target=verify_proxies, args=(each,)).start()
time.sleep(4)
for i in range(len(valid_proxies)):
response = request_function(url_to_scrape, valid_proxies[i])
if response is not None:
next_button_link = data_extract(response)
break
else:
continue
for proxy in valid_proxies:
print(f"Using Proxy: {proxy['proxy_address']}")
response = request_function(next_button_link, proxy)
if response is not None:
next_button_link = data_extract(response)
else:
continue
for each in range(len(book_names)):
print(
f"No {each + 1}: Book Name: {book_names[each]} Book Price: {book_price[each]} and Availability {book_availability[each]}")
Sau khi thực hiện thành công, kết quả trông giống như bên dưới. Điều này tiếp tục trích xuất thông tin trên hơn 100 cuốn sách bằng 2 proxy được cung cấp.
Sử dụng nhiều proxy để quét web cho phép tăng số lượng yêu cầu đối với tài nguyên đích và giúp bỏ qua chặn chặn. Để duy trì sự ổn định của quá trình cạo, nên sử dụng các địa chỉ IP cung cấp tốc độ cao và yếu tố tin cậy mạnh mẽ, chẳng hạn như ISP tĩnh và các proxy dân cư động. Ngoài ra, chức năng của tập lệnh được cung cấp có thể dễ dàng mở rộng để đáp ứng các yêu cầu cạo dữ liệu khác nhau.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0