Python和PHP代码能直接运行吗?

107 阅读3分钟

在实际使用中,提供的Python和PHP代码片段需要根据具体情况进行调整和优化,才能直接运行。以下是代码运行前需要考虑的一些关键点和可能需要的调整:


Python代码运行前的准备

1. 安装必要的库

确保已安装以下Python库:

  • selenium:用于模拟浏览器行为。
  • beautifulsoup4:用于解析HTML。
  • webdriver-manager:用于管理WebDriver。

安装命令:

pip install selenium beautifulsoup4 webdriver-manager

2. 检查ChromeDriver

代码中使用了webdriver-manager来自动管理ChromeDriver,但你也可以手动下载并指定ChromeDriver的路径。

3. 调整选择器

亚马逊的HTML结构可能会发生变化,因此需要检查页面结构并调整选择器。例如:

  • 商品标题选择器:a-size-medium a-color-base a-text-normal
  • 商品价格选择器:a-price-whole
  • 商品链接选择器:a-link-normal

如果页面结构发生变化,需要更新这些选择器。

4. 处理动态内容

如果页面内容是通过JavaScript动态加载的,确保Selenium能够正确加载页面。可以添加显式等待(WebDriverWait)来确保页面元素加载完成。

5. 代理和请求头

为了防止被封禁IP,建议设置代理IP,并在请求头中添加合适的User-Agent


PHP代码运行前的准备

1. 安装必要的库

确保已安装以下PHP库:

  • guzzlehttp/guzzle:用于发送HTTP请求。

安装命令:

composer require guzzlehttp/guzzle

2. 检查HTML结构

与Python类似,PHP代码中的HTML选择器也需要根据亚马逊页面的实际结构进行调整。例如:

  • 商品标题选择器://span[@class="a-size-medium a-color-base a-text-normal"]
  • 商品价格选择器://span[@class="a-price-whole"]
  • 商品链接选择器://a[@class="a-link-normal"]

如果页面结构发生变化,需要更新这些XPath选择器。

3. 处理HTML编码

在解析HTML时,可能会遇到编码问题。建议在解析前将HTML内容转换为UTF-8编码:

$htmlContent = mb_convert_encoding($htmlContent, 'HTML-ENTITIES', 'UTF-8');

4. 容错处理

在解析HTML时,可能会遇到语法错误或不规范的标签。建议使用libxml_use_internal_errors()来禁用错误提示:

libxml_use_internal_errors(true);
$doc->loadHTML($htmlContent);
libxml_clear_errors();

5. 代理和请求头

为了防止被封禁IP,建议在请求头中添加合适的User-Agent,并使用代理IP。


代码调整示例

Python代码调整

以下是调整后的Python代码,增加了显式等待和代理支持:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

def search_amazon(keyword):
    url = f"https://www.amazon.com/s?k={keyword}"
    driver.get(url)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.s-result-item")))

def parse_products():
    soup = BeautifulSoup(driver.page_source, 'lxml')
    products = []
    for product in soup.select('div.s-result-item'):
        try:
            title = product.select_one('span.a-size-medium').text
            price = product.select_one('span.a-price-whole').text
            link = product.select_one('a.a-link-normal')['href']
            products.append({'title': title, 'price': price, 'link': link})
        except AttributeError:
            continue
    return products

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
keyword = "python books"
search_amazon(keyword)
products = parse_products()
for product in products:
    print(product)
driver.quit()

PHP代码调整

以下是调整后的PHP代码,增加了HTML编码处理和容错处理:

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

function fetchPageContent($url) {
    $client = new Client();
    $response = $client->request('GET', $url, [
        'headers' => [
            'User-Agent' => 'Mozilla/5.0'
        ]
    ]);
    return mb_convert_encoding($response->getBody()->getContents(), 'HTML-ENTITIES', 'UTF-8');
}

function parseProducts($htmlContent) {
    $doc = new DOMDocument();
    libxml_use_internal_errors(true);
    $doc->loadHTML($htmlContent);
    libxml_clear_errors();
    $xpath = new DOMXPath($doc);

    $products = [];
    $results = $xpath->query('//div[@data-component-type="s-search-result"]');
    foreach ($results as $product) {
        try {
            $title = $xpath->query('.//span[@class="a-size-medium a-color-base a-text-normal"]', $product)->item(0)->textContent;
            $price = $xpath->query('.//span[@class="a-price-whole"]', $product)->item(0)->textContent;
            $link = $xpath->query('.//a[@class="a-link-normal"]', $product)->item(0)->getAttribute('href');
            $products[] = ['title' => $title, 'price' => $price, 'link' => $link];
        } catch (Exception $e) {
            continue;
        }
    }
    return $products;
}

function amazonCrawler($keyword) {
    $url = "https://www.amazon.com/s?k=" . urlencode($keyword);
    $htmlContent = fetchPageContent($url);
    return parseProducts($htmlContent);
}

$keyword = "python books";
$products = amazonCrawler($keyword);
foreach ($products as $product) {
    echo "Title: " . $product['title'] . "\n";
    echo "Link: " . $product['link'] . "\n";
    echo "Price: " . $product['price'] . "\n";
    echo "-------------------\n";
}
?>

总结

虽然提供的代码片段是一个很好的起点,但在实际使用中,需要根据目标网站的结构和反爬机制进行调整。建议在运行代码前:

  1. 检查HTML结构并调整选择器。
  2. 添加必要的库和依赖。
  3. 配置代理和请求头。
  4. 增加容错处理和编码支持。

通过这些调整,你可以确保代码在实际环境中顺利运行,并高效地获取亚马逊商品信息。