Hướng dẫn python interact with website without selenium - python tương tác với trang web mà không có selen

Chúng tôi, máy quét web, biết sử dụng selenium để cạo một trang web động. Nhưng, sau một số kinh nghiệm và khám phá, chúng tôi thấy rằng selen không phải lúc nào cũng cần thiết.

Nó là đơn giản để hiểu. Sau khi tất cả các trang web sử dụng một số API hoặc Web-hooks. Người dùng tương tác với các trang web thông qua GET, đăng hoặc bất kỳ yêu cầu nào như vậy. Là máy quét web, chúng tôi chỉ muốn dữ liệu từ trang web. Và, các trang web tải/gửi dữ liệu từ/đến một số cơ sở dữ liệu. Để sử dụng/trình bày dữ liệu đó, các trang web sử dụng API. Chúng tôi chỉ cần tìm những yêu cầu đó, bắt chước chúng và lưu dữ liệu.

Một vài ngày trước, tôi đã thử cùng một phương pháp. Tôi đã phải thu thập các sản phẩm dữ liệu từ ReserveBar. Nhưng thách thức là tôi phải thu thập tất cả cho một địa điểm cụ thể.

Trên trang chủ, chúng ta có thể thấy các danh mục trong tiêu đề và nhập địa chỉ phân phối ngay dưới tiêu đề.

www2.reservebar.com Trang chủ

Vì vậy, chúng tôi có 4 loại, tinh thần cho quà tặng và phụ kiện. Để tìm sản phẩm tại một vị trí cụ thể, chúng tôi phải nhấp vào trường vị trí và nhập địa chỉ, sau đó nó hiển thị danh sách các địa chỉ và chúng tôi phải nhấp vào một để điền vào trường, sau đó nhấp vào ‘Lưu. Điều này tiết kiệm vị trí và chúng tôi có thể nhận được sản phẩm cho vị trí. Làm điều này thêm một thẻ cho các sản phẩm hiển thị nếu một sản phẩm có sẵn tại vị trí hay không.

www2.reservebar.com Trang thể hiện hiển thị thêm nút

Khi chúng tôi mở một danh mục, nó không hiển thị tất cả các sản phẩm, thay vào đó, nó hiển thị một số sản phẩm của nó và một nút hiển thị nhiều hơn. Để có thêm sản phẩm, chúng tôi phải nhấp vào nút này cho đến khi chúng tôi nhận được tất cả các sản phẩm.

Tất nhiên, điều này có thể được thực hiện với selen, rất dễ dàng.

Nhưng, tôi đã làm điều đó mà không có selen.

Giải pháp không có selen

Đây là cách tôi quản lý nó mà không cần selen.

Với mục đích của chúng tôi, nhận được tất cả các sản phẩm từ bốn loại trong tiêu đề là đủ. Vì vậy, tôi chỉ tạo ra một danh sách bốn loại.

collections = ['spirits', 'wine', 'discover', 'gifts-accessories']

Đối với URL của mỗi danh mục, tôi chỉ thêm các tên vào liên kết chính của chúng tôi

https://www2.reservebar.com/collections/{category}

Điều này sẽ tìm kiếm cho mỗi liên kết thay vì nhấp vào từng liên kết trên trang chủ.

Sử dụng các công cụ phát triển, tôi có thể tìm thấy yêu cầu được kích hoạt khi nhấp vào nút hiển thị thêm nút. Vì vậy, tôi đã sao chép yêu cầu đó với các tiêu đề và cookie của nó. Các cookie đã giúp đặt vị trí.

Sử dụng yêu cầu

Vì vậy, đây là cách tôi nhấp vào nút ‘Hiển thị thêm mà không thực sự mở trình duyệt. Hãy để tôi chia toàn bộ kịch bản thành các phần.

1- Dòng mã sau đây bao gồm cookie cho yêu cầu

import requestsfrom bs4 
import BeautifulSoup as bs
import pandas as pd
root_url = "https://www2.reservebar.com" # products' addresses will be appended to this root URLpayload={} # an empty data payload
# headers for our request
headers = { 'authority': 'www2.reservebar.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Chromium";v="103", ".Not/A)Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36', 'Cookie': '__cq_dnt=1; dw_dnt=1; dwanonymous_a40f731d0711af5eb64499a73962349d=acufdphn0DuqzTqpqehaZp0DTc; dwsid=__EYAfXIo7BoEcYW1pQyOh0NcUmbp9wkncr3rR5ZPH6TknOGh6nHxPMEspRdXYKdgSkuZdsQqkrhWpEOf8P0NA==; sid=P67PVuk3mQcAmmYLM16Xkt1Sph6HWOaT9UE'}

Cookie trong các tiêu đề này đóng vai trò thiết lập vị trí.

2- Những dòng được đưa ra dưới đây là danh sách để lưu trữ dữ liệu

# list of categories
collections = ['spirits', 'wine', 'discover', 'gifts-accessories']
# list to store products' links
products_links = []

3- Tất cả các dòng bên dưới đều ở bên trong một vòng lặp

# for each category in the categories' list
for cat in collections:
# set its URL
cat_url = f"https://www2.reservebar.com/collections/{cat}"
# send a GET request to the URL
cat_res = requests.request("GET", cat_url, headers=headers, data=payload)
# find the total number of results/products in that category
soup = bs(cat_res.text, 'html.parser')
more_results = soup.find('span', class_='results-span').get_text().strip().split(' ')[0].split(',')
results = int(''.join(more_results))
# print the total number of products in that category
print(f"link: {cat_url}", " results: ",results)

Đầu tiên tôi sử dụng dòng sau để có được tất cả các sản phẩm cùng một lúc.

show_more_link = f"https://www2.reservebar.com/on/demandware.store/Sites-reservebarus-Site/default/Search-UpdateGrid?cgid={cat}&start={start}&sz={size}&selectedUrl=https%3A%2F%2Fwww2.reservebar.com%2Fon%2Fdemandware.store%2FSites-reservebarus-Site%2Fdefault%2FSearch-UpdateGrid%3Fcgid%3D{cat}%{results}start%3D{1}%{results}sz%3D{results}"

Nhưng nó vẫn không thể tải nguồn đầy đủ. Vì vậy, tôi đã gửi yêu cầu này trong các phần, thay vì tải tất cả các sản phẩm cùng một lúc tôi tải các sản phẩm với số lượng lớn hơn so với được tải bởi tập lệnh thực tế. Tôi đã tải 100 sản phẩm cho đến khi tất cả các sản phẩm được tải. Và, với mục đích này, tôi đã sử dụng một cách lồng nhau trong khi vòng lặp bên trong cha mẹ ‘cho vòng lặp.

Các dòng sau nằm trong chính ‘cho vòng lặp

    # counter for the number of product to start from, to load from the API
start = 1
# number of products to load in a single request
size = 100
# the while loop
while True:
# if start position becomes equal to greater than the total number of products, break the while loop and move forward to next category
if start>=results:
break
# the request to show more products, with variable paramaters indicated inside curly brackets
show_more_link = f"https://www2.reservebar.com/on/demandware.store/Sites-reservebarus-Site/default/Search-UpdateGrid?cgid={cat}&start={start}&sz={size}&selectedUrl=https%3A%2F%2Fwww2.reservebar.com%2Fon%2Fdemandware.store%2FSites-reservebarus-Site%2Fdefault%2FSearch-UpdateGrid%3Fcgid%3D{cat}%{size}start%3D{start}%{size}sz%3D{size}"
# send the GET request to load more products
response = requests.request("GET", show_more_link, headers=headers, data=payload)
# from the response get all the products found which do not have a tag indicating not available at the location
soup = bs(response.text, 'html.parser')
all_products = soup.find_all('div', class_="product-tile")

for prod in all_products:
if "Not available in IL" in prod.get_text():
...
else:
a = prod.find('a')
products_links.append(root_url+a['href'])
# print(a['href'])

# increment start number by 1
start += 100
print("number of products' links: ", len(products_links))

Ở đây kết thúc ‘cho vòng lặp và các sản phẩm liên kết liên kết.

Theo cách này, tôi đã loại bỏ gần như tất cả các sản phẩm của các danh mục và sau đó lưu chúng trong tệp .csv cho một bản ghi và sử dụng sau.

Đây là mã hoàn chỉnh của ứng dụng này.

Kịch bản để thực hiện các sự kiện nhấp chuột và để loại bỏ các sản phẩm thanh dự trữ mà không cần sử dụng Selenium, bởi Irfan Ahmad

Sau này, tôi không có thời gian để kiểm tra thêm các yêu cầu. Vì vậy, tôi chỉ sử dụng selen để loại bỏ từng thông tin về sản phẩm cho vị trí. Bởi vì các liên kết này đã sử dụng một số loại yêu cầu khác nhau và kết hợp. Đó là lý do tại sao để tiết kiệm thời gian của tôi từ đây, tôi vừa thực hiện những gì tôi đã biết.

Sự kết luận

Chúng tôi có thể theo dõi các yêu cầu của trang web về một số sự kiện từ các công cụ phát triển và có thể sao chép chúng để lấy dữ liệu thay vì sử dụng selenium để nhấp hoặc các sự kiện dựa trên yêu cầu khác. Nhưng, nó không phải lúc nào cũng áp dụng.

Học tập không bao giờ kết thúc, vì vậy tôi sẽ tiếp tục học, thử nghiệm và chia sẻ.

Nếu bạn là người mới, tôi cũng đã viết trên các trang web năng động với Selenium Phần 1, Phần II, Phần III, Phần IV và Phần V.

Python có thể lấy dữ liệu từ một trang web không?

Khi lấy dữ liệu từ các trang web có Python, bạn thường quan tâm đến các phần cụ thể của trang. Bằng cách dành một chút thời gian để xem qua tài liệu HTML, bạn có thể xác định các thẻ với các thuộc tính duy nhất mà bạn có thể sử dụng để trích xuất dữ liệu bạn cần., you're often interested in particular parts of the page. By spending some time looking through the HTML document, you can identify tags with unique attributes that you can use to extract the data you need.

Làm thế nào để bạn nhấp vào một trang web trong Python?

Làm thế nào để bạn tạo một tập lệnh nhấp vào một nút trên một trang web ?..
từ Selenium Nhập WebDriver ..
Nhập Webbrowser ..
Trình điều khiển = WebDriver.Trình duyệt Chrome().
người lái xe.Nhận ("Ví dụ.com").
nút = trình điều khiển.find_element_by_id ('idofbutton').
cái nút.nhấp chuột().

Làm thế nào để bạn tự động hóa một trang web trong Python?

Cách chạy các bài kiểm tra selen đầu tiên của bạn với Python: ví dụ..
Đầu tiên nhập các lớp WebDriver và khóa từ Selenium.....
Tiếp theo, tạo một thể hiện Chrome với đường dẫn của trình điều khiển mà bạn đã tải xuống qua các trang web của trình duyệt tương ứng.....
Tiếp theo, sử dụng.....
Khi trang tải thành công, bạn có thể sử dụng ..

Selenium có tốt hơn đẹp không?

Selenium đang ở nhà cào tương đối phức tạp hơn, các trang năng động với mức giá của chi phí tài nguyên tính toán cao hơn.Súp đẹp dễ dàng hơn để bắt đầu, và mặc dù hạn chế hơn trong các trang web, nó có thể cạo, nó rất lý tưởng cho các dự án nhỏ hơn nơi các trang nguồn được cấu trúc tốt.. Beautiful Soup is easier to get started with, and although more limited in the websites it can scrape, it's ideal for smaller projects where the source pages are well structured.