Python 爬虫爬取京东商品信息
下面我将逐一解释每一部分的代码
导入库
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import time
import random
import csv
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import os
import requests
from datetime import datetime
import re
-
作用:导入所有必要的库和模块。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。 -
time
,random
: 用于添加延迟和生成随机数。 -
csv
: 用于读写CSV文件。 -
os
: 用于文件系统操作。 -
requests
: 用于发送HTTP请求(例如下载图片)。 -
datetime
: 用于处理日期和时间。 -
re
: 用于正则表达式匹配。
-
配置变量
KEYWORD = '美妆'
CSV_FILE = 'DepartmentStore.csv'
id = 3538
dratenums = 5
drate = 5
num = 5
-
作用:初始化全局变量。
-
技术栈:无特殊技术栈。
设置WebDriver
# 创建EdgeOptions对象
options = Options()
# 设置Edge WebDriver的路径
webdriver_path = 'G:\\大三下暑期实训基于电商商品推荐平台\\爬虫\\a\\msedgedriver.exe'
service = Service(webdriver_path)
# 初始化Edge WebDriver
driver = webdriver.Edge(service=service, options=options)
# 窗口最大化
driver.maximize_window()
wait = WebDriverWait(driver, 15)
-
作用:初始化Microsoft Edge WebDriver。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。
-
函数定义
search_goods
函数
def search_goods(start_page, total_pages):
# ...
-
作用:搜索特定商品并处理翻页逻辑。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。 -
pyquery
: 用于解析HTML文档。 -
time
: 用于添加延迟。 -
random
: 用于生成随机数。
-
page_turning
函数
def page_turning(page_number):
# ...
-
作用:实现翻页操作。
-
技术栈:
selenium
: 用于自动化浏览器操作。
random_sleep
函数
def random_sleep(timeS, timeE):
# ...
-
作用:随机等待一段时间,防止被网站检测到爬虫行为。
-
技术栈:
time
,random
: 用于添加延迟和生成随机数。
scroll_smoothly
函数
def scroll_smoothly(duration):
# ...
-
作用:平滑滚动页面以模拟真实用户行为。
-
技术栈:
selenium
: 用于自动化浏览器操作。
get_goods
函数
def get_goods():
# ...
-
作用:获取商品列表中的具体信息。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。 -
pyquery
: 用于解析HTML文档。 -
os
: 用于文件系统操作。 -
requests
: 用于发送HTTP请求(例如下载图片)。 -
datetime
: 用于处理日期和时间。 -
re
: 用于正则表达式匹配。
-
save_to_csv
函数
def save_to_csv(result):
# ...
-
作用:将获取到的商品信息保存到CSV文件中。
-
技术栈:
csv
: 用于读写CSV文件。
main
函数
def main():
# ...
-
作用:主函数,用于启动爬虫并处理异常。
-
技术栈:无特殊技术栈。
主程序入口
if __name__ == '__main__':
main()
-
作用:程序的入口点。
-
技术栈:无特殊技术栈。
接下来,我将针对每个函数进行详细的代码解释。
search_goods
函数
def search_goods(start_page, total_pages):
print('正在搜索: ')
try:
driver.get('https://www.taobao.com')
time.sleep(10)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
input.send_keys(KEYWORD)
submit.click()
time.sleep(10)
if start_page != 1:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
random_sleep(1, 3)
pageInput = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/span[3]/input')))
pageInput.send_keys(start_page)
admit = wait.until(EC.element_to_be_clickable(
(By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[3]')))
admit.click()
get_goods()
for i in range(start_page + 1, start_page + total_pages):
page_turning(i)
excep