1. 程式人生 > 其它 >爬取例項和selenium模組

爬取例項和selenium模組

爬取城市名稱

熱門城市名稱

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。