日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用selenium爬取某东的手机商品信息

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用selenium爬取某东的手机商品信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序完整代碼

from selenium import webdriver # 自動化爬取工具庫 import time # 讓程序休眠一段時間的庫 from lxml import etree # lxml解析庫 import mysql.connector # Python和數據庫連接庫 import random # 生成隨機數的庫 from typing import NoReturn, Tuple, List # 類型標記庫class JD_example():"""爬取某東的類"""def __init__(self, table_name: str) -> NoReturn:"""初始化table_name:在MySQL中要創建并用來存儲爬取數據的表的名稱"""self.browser = webdriver.Chrome() # 初始化一個瀏覽器對象self.browser.get('https://www.jd.com/') # 打開網址self.table_name = table_name # 實例屬性,MySQL中的表名self.start_id = 1 # 實例屬性,插入數據庫中數據的起始IDself.conn = mysql.connector.connect( # 構建和MySQL的連接host='localhost',user='root',passwd='123456',port=3307,charset='utf8',database='reptile',)self.mycursor = self.conn.cursor() # 構建油標def append_to_database(self) -> NoReturn:"""將數據新加到表中"""self.start_id = self.get_DBcount() + 1def get_DBcount(self) -> int:"""獲取表中的數據的條數"""self.mycursor.execute("select count(*) from {};".format(self.table_name))result = self.mycursor.fetchone()[0]return resultdef set_product(self, keyword: str) -> NoReturn:"""輸入要搜索的商品的名稱并點擊搜索按鈕keyword:要搜索的商品的名稱"""self.browser.implicitly_wait(5) # 設置隱式等待的時間# 找到搜索框并輸入商品名稱self.browser.find_element_by_css_selector('#key').send_keys(keyword)time.sleep(random.choice([1, 1.4, 1.5, 2])) # 休眠一段隨機時間# 找到搜索按鈕并點擊self.browser.find_element_by_css_selector('.button').click()self.browser.maximize_window() # 窗口最大化def clear_search_box(self) -> NoReturn:"""清空搜索框中的內容"""self.browser.find_element_by_css_selector('#key').clear()time.sleep(random.random())def drop_down(self) -> NoReturn:"""向下滑動頁面"""for x in range(0, 11): # 向下滑動一段隨機距離,重復11次time.sleep(2)js = str('window.scrollBy(0,{})'.format(x * random.randint(70, 95)))self.browser.execute_script(js)# 下滑至下一頁按鈕出現在頁面的最下方self.browser.execute_script("document.querySelector('a.pn-next').scrollIntoView(false)")time.sleep(random.randint(1, 3))def parse_data(self) -> NoReturn:"""獲取頁面數據"""html = self.browser.page_source # 獲取頁面源碼e = etree.HTML(html) # 初始化xpathli_list = e.xpath('//*[@id="J_goodsList"]/ul/li') # 選取目標li標簽,生成一個li標簽列表# 每一個li標簽對應一個商品,標簽中包含商品的價格,名稱,評價等信息,下面就是遍歷每一個li標簽# 獲取其中的商品信息res = []for li in li_list:try:price = float(''.join(li.xpath('./div/div[3]/strong/i/text()')).strip().replace(' ', ''))name = li.xpath('string(./div/div[contains(@class,"name")]/a/em)').strip().replace('\n', '')evaluate = li.xpath('string(./div/div[contains(@class,"commit")]/strong)').strip().replace('\n', '')tem = tuple((self.start_id, price, name, evaluate))res.append(tem)print(self.start_id, price, name, evaluate, sep='|')self.start_id += 1except:continuereturn tuple(res)def click_next_page(self) -> NoReturn:"""點擊下一頁"""self.browser.find_element_by_xpath('//a[@class="pn-next"]').click()def create_table(self) -> NoReturn:"""在mysql中創建一個名為輸入的表名的表"""self.mycursor.execute("create table if not exists {}(\ID int ,\price decimal(10, 2),\product_name varchar(200),\evaluate varchar(20),\primary key (ID)\) ENGINE=INNODB DEFAULT CHARSET='utf8mb4' COLLATE='utf8mb4_unicode_ci'".format(self.table_name))def insert_into_mysql(self, goods_tuple: Tuple[Tuple]) -> NoReturn:"""將數據插入到表中goods_tuple:一個元組,元組的每一個元素也是元組,其中包含一個商品的id,價格,評價數量"""sql_insert = "insert into {} values (%s, %s, %s, %s)".format(self.table_name)self.mycursor.executemany(sql_insert, goods_tuple)self.conn.commit()def start(self, goods_lists: List[str], page_numbers: int) -> NoReturn:"""開始爬取goods_lists:要爬取的商品的列表page_numbers:每個商品要爬取的頁數"""self.create_table()for good in goods_lists:self.set_product(good)self.append_to_database()for i in range(0, page_numbers):self.drop_down()time.sleep(5)goods_tuple = self.parse_data()self.insert_into_mysql(goods_tuple)self.click_next_page()self.clear_search_box()self.mycursor.close()self.conn.close()self.browser.close()if __name__ == '__main__':"""程序入口"""jd1 = JD_example('jd0')goods_lists = ['華為手機', 'ViVo手機', 'OPPO手機']page_numbers = 1jd1.start(goods_lists, page_numbers)

準備工作

  • 安裝好MySQL
  • 安裝好selenium并且電腦中有Chrome瀏覽器,下載好與自己的Chrome瀏覽器版本對應的selenium驅動,將驅動(可執行文件)放在Python的安裝目錄下的Scripts目錄下
  • 安裝好程序中所需要的第三方庫
  • 打開MySQL服務
  • 更改程序__init__方法中與數據庫連接的配置,如用戶名、密碼、數據庫名等信息
  • 仔細看代碼中的注釋,我將代碼的作用都寫在注釋中
  • 如果代碼有些看不懂,記得多查一查
  • 當然,如果你對程序很了解之后,你可以對它進行改造,爬取更多種的商品,每種商品的信息數量也可以加大,消耗的時間也會相應的增加
  • 寫下這篇文章的時間是2021.03 ,某東沒有針對selenium的檢查,也沒有搜索商品需要登錄的要求,當你看到這篇文章的時候,我不敢保證某東沒有針對爬蟲做技術升級

運行效果


總結

以上是生活随笔為你收集整理的使用selenium爬取某东的手机商品信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。