我們先來說一下selenium語法
selenium這個語法呢就是模擬用戶點擊可以有效率的防止反爬下面我們來介紹一下用法鸳址。話不多說上代碼娱两。講解看注釋!一個關于獲取斗魚數(shù)據(jù)的代碼纺荧!
from selenium import webdriver
import json
import time
class Douyu:
# 1.發(fā)送首頁的請求
def __init__(self):
self.driver = webdriver.PhantomJS()
self.driver.get("https://www.douyu.com/directory/all") #請求首頁
#獲取沒頁面內(nèi)容
def get_content(self):
time.sleep(3) #每次發(fā)送完請求等待三秒簇秒,等待頁面加載完成
li_list = self.driver.find_elements_by_xpath('//ul[@id="live-list-contentbox"]/li')
contents = []
#遍歷房間列表
for i in li_list:
item = {}
#獲取房間圖片
item["img"] = i.find_element_by_xpath("./a//img").get_attribute("src")
#獲取房間名字
item["title"] = i.find_element_by_xpath("./a").get_attribute("title")
#獲取房間分類
item["category"] =i.find_element_by_xpath("./a/div[@class='mes']/div/span").text
#獲取主播名字
item["name"] = i.find_element_by_xpath("./a/div[@class='mes']/p/span[1]").text
#獲取觀看人數(shù)
item["watch_num"]=i.find_element_by_xpath("./a/div[@class='mes']/p/span[2]").text
print(item)
contents.append(item)
return contents
#保存本地
def save_content(self,contents):
f = open("douyu.txt","a")
for content in contents:
json.dump(content,f,ensure_ascii=False,indent=2)
f.write("\n")
f.close()
def run(self):
#1.發(fā)送首頁的請求
#2.獲取第一頁的信息
contents = self.get_content()
#保存內(nèi)容
self.save_content(contents)
#3.循環(huán) 點擊下一頁按鈕,知道下一頁對應的class名字不再是"shark-pager-next"
#判斷有沒有下一頁
while self.driver.find_element_by_class_name("shark-pager-next"):
#點擊下一頁的按鈕
self.driver.find_element_by_class_name("shark-pager-next").click() #
# 4.繼續(xù)獲取下一頁的內(nèi)容
contents = self.get_content()
#4.1.保存內(nèi)容
self.save_content(contents)
if __name__ == "__main__":
douyu = Douyu()
douyu.run()
下面我們來說一下xpath常用語法以及介紹
表達式 描述
nodename 選取此節(jié)點的所有子節(jié)點擒悬。
/ 從根節(jié)點選取模她。
// 從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置懂牧。
. 選取當前節(jié)點侈净。
.. 選取當前節(jié)點的父節(jié)點。
@ 選擇屬性僧凤。
下面我們來說一下用法畜侦!詳細用法看代碼注釋!一個關于獲取起點數(shù)據(jù)的代碼躯保!
#導入所需要的包
import os
import urllib
import urllib2
from lxml import etree
def qidianSpider(start_url):
get_noval_list_by_url(start_url)
def get_noval_list_by_url(req_url):
"""
#根據(jù)分頁的url,獲取分頁的頁面源碼旋膳,提取小說的信息
#req_url:表示每一個分頁的url
"""
#構建一個請求頭
req_header = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
#發(fā)起請求,獲取響應結(jié)果
response = requests.get(url=req_url,headers=req_header)
if response.status_code == 200:
#提取小說的信息
#使用etree.HTML可以將html文檔源碼,轉(zhuǎn)為一個element對象,
#然后才能使用xpath語法
html_element = etree.HTML(response.text)
#提取小說列表
noval_lis = html_element.xpath('//ul[@class="all-img-list cf"]/li')
print(len(noval_lis))
print(noval_lis)
for noval_li in noval_lis:
#封面圖片
coverImage = noval_li.xpath('./div[@class="book-img-box"]/a/img/@src')[0]
#標題
title = noval_li.xpath('./div[@class="book-mid-info"]/h4/a/text()')[0]
#作者
author = noval_li.xpath('.//a[@class="name"]/text()')[0]
print(coverImage, title, author)
if __name__ == '__main__':
start_url = 'https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1'
qidianSpider(start_url)