我们先来说一下selenium语法
selenium这个语法呢就是模拟用户点击可以有效率的防止反爬下面我们来介绍一下用法。话不多说上代码。讲解看注释!一个关于获取斗鱼数据的代码!
from selenium import webdriver
import json
import time
class Douyu:
# 1.发送首页的请求
def __init__(self):
self.driver = webdriver.PhantomJS()
self.driver.get("https://www.douyu.com/directory/all") #请求首页
#获取没页面内容
def get_content(self):
time.sleep(3) #每次发送完请求等待三秒,等待页面加载完成
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
#获取观看人数
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.发送首页的请求
#2.获取第一页的信息
contents = self.get_content()
#保存内容
self.save_content(contents)
#3.循环 点击下一页按钮,知道下一页对应的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.继续获取下一页的内容
contents = self.get_content()
#4.1.保存内容
self.save_content(contents)
if __name__ == "__main__":
douyu = Douyu()
douyu.run()
下面我们来说一下xpath常用语法以及介绍
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选择属性。
下面我们来说一下用法!详细用法看代码注释!一个关于获取起点数据的代码!
#导入所需要的包
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):
"""
#根据分页的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',
}
#发起请求,获取响应结果
response = requests.get(url=req_url,headers=req_header)
if response.status_code == 200:
#提取小说的信息
#使用etree.HTML可以将html文档源码,转为一个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)