爬取例項和selenium模組
阿新 • • 發佈:2021-09-29
爬取城市名稱
熱門城市名稱
hot_city_names = tree.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()')
一般城市名稱
other_city_names = tree.xpath('//div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
所有城市名稱
all_city_names = tree.xpath( '//div[@class="hot"]/div[2]/ul/li/a/text() | //div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
程式碼
import requests from lxml import etree res = requests.get("https://www.aqistudy.cn/historydata/", headers={ 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } ) tree = etree.HTML(res.text) hot_city_names = tree.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()') other_city_names = tree.xpath('//div[@class="all"]/div[2]/ul/div[2]/li/a/text()') all_city_names = tree.xpath( '//div[@class="hot"]/div[2]/ul/li/a/text() | //div[@class="all"]/div[2]/ul/div[2]/li/a/text()') print(all_city_names)
爬取豬八戒資料
所有含有資料的div
div_list = tree.xpath('//div[@class="new-service-wrap"]/div')
公司名稱
因為有空資料,所以要進行判斷
if not company_name: continue
訂單價格
order_price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()')
歷史成交
order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')
訂單描述
order_desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()')
程式碼
# 需求:公司名稱 地址 價格 成交量 描述資訊 import requests from lxml import etree from openpyxl import Workbook wb = Workbook() wb1 = wb.create_sheet('訂單資料', 0) wb1.append(['公司名稱', '公司地址', '訂單價格', '歷史成交', '訂單描述']) # 1.傳送請求獲取頁面資料 res = requests.get('https://shanghai.zbj.com/search/f/', params={'kw': 'app'} ) # 2.生成xpath物件 tree = etree.HTML(res.text) # 3.研究標籤規律 書寫xpath # 直接查詢 '''直接查詢很多時候是無法使用的 因為會出現資料混亂的現象''' # company_name = tree.xpath('//div[@class="new-service-wrap"]/div/div/div/a/div[1]/p/text()') # print(company_name) # 先查詢所有含有資料的div 之後依次迴圈 div_list = tree.xpath('//div[@class="new-service-wrap"]/div') for div in div_list: # 公司名稱 company_name = div.xpath('./div/div/a/div[1]/p/text()') # 如果獲取不到公司名稱 在該網站上是廣告位 if not company_name: continue # print(company_name[-1].strip('\n')) # 公司地址 address_info = div.xpath('./div/div/a/div[1]/div/span/text()') # print(address_info[0]) # 訂單價格 order_price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()') # print(order_price[0]) # 歷史成交 order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()') # print(order_num[0]) # 訂單描述 order_desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()') # print('app'.join(order_desc)) wb1.append([company_name[-1].strip('\n'), address_info[0], order_price[0], order_num[0], 'app'.join(order_desc)]) wb.save(r'訂單資料.xlsx') # 擴充套件:針對多頁資料此處使用後續模組會更加方便
爬取貼吧圖片資料
注意:儘量停頓時間多一點,1秒是不夠的,建議三秒,否則會有驗證碼要求。
程式碼
import requests from lxml import etree import os import time # 獲取使用者想要爬取的貼吧名稱 tieba_name = input('請輸入你想要爬取的貼吧名稱>>>:').strip() # 判斷當前貼吧名稱是否存在對應的資料夾 if not os.path.exists(tieba_name): os.mkdir(tieba_name) # 1.傳送請求 # TODO:多頁資料 只需要再加一個pn引數即可 res = requests.get('https://tieba.baidu.com/f', params={'kw': tieba_name} ) # 2.生成一個xpath物件 tree = etree.HTML(res.text) # 3.查詢所有帖子的連結地址 a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href') base_url = 'https://tieba.baidu.com' # 4.迴圈獲取每一個帖子連結 拼接成完整的地址 再發送請求 for link in a_link_list: full_link = base_url + link print(full_link) # 5.傳送詳情頁請求獲取頁面資料 res1 = requests.get(full_link) tree1 = etree.HTML(res1.text) # 6.篩選圖片連結地址 img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src') # 7.迴圈請求每個圖片地址 並儲存圖片 for img_src in img_src_list: res2 = requests.get(img_src) file_path = os.path.join(tieba_name, img_src[-15:]) with open(file_path, 'wb') as f: f.write(res2.content) time.sleep(3)
selenium模組
驅動下載
該模組是用來操作瀏覽器的,需要相應的驅動軟體(必備)。
下載地址:https://npm.taobao.org/mirrors/chromedriver,需要根據自己的chrome版本下載對應版本。
存放路徑
下載好的檔案解壓到python直譯器的scripts目錄下,該路徑需要配置到環境變數中。
驗證
from selenium import webdriver import time # 指定操作的瀏覽器驅動 bro = webdriver.Chrome() # 控制瀏覽器訪問網站資料 bro.get("http://www.baidu.com") # 關閉瀏覽器視窗 time.sleep(3) bro.close()
基本操作
# 1、find_element_by_id 根據id找 # div_tag = bro.find_element_by_id('s-top-left') # 2、find_element_by_link_text 根據連結名字找到控制元件(a標籤的文字) # a_tag = bro.find_element_by_link_text("新聞") # 3、find_element_by_partial_link_text 根據連結名字找到控制元件(a標籤的文字)模糊查詢 # 4、find_element_by_tag_name 根據標籤名 # 5、find_element_by_class_name 根據類名 # 6、find_element_by_name 根據屬性名 # 7、find_element_by_css_selector 根據css選擇器 # 8、find_element_by_xpath 根據xpath選擇
find_element與find_elements的區別就在於前者只會找到符合條件的第一個,後者是所有。
兩者的關係相當於bs4模組裡面的find與find_all。