目录
1.糗事百科-xpath
2.动态网站数据抓取 - Ajax
3.json模块
4.selenium + phantomjs 强大的网络爬虫
1.selenium
2.phantomjs
3.常用方法
5.BeautifulSoup
糗事百科xpath匹配答案存mongo数据库
豆瓣网登录
斗鱼主播名字和观众人数
1.目标:用户昵称 段子内容 好笑数 评论数
2.步骤
1.找URL
https://www.qiushibaike.com/8hr/page/1/
2.xpath匹配
基准的xpath每个段子:
//div[contains(@id,"qiushi_tag_")]
用户昵称:./div/a/h2
段子内容:.//div[@class="content"]/span
好笑数量:.//i
评论数量:.//i
1.Ajax动态加载
1.特点:动态加载(滚动鼠标滑轮时加载)
2.案例:豆瓣电影top100榜单(剧情)
import requests
import json
import csv
url = "https://movie.douban.com/j/chart/top_list?"
params = {"type":"11",
"interval_id":"100:90",
"action":"",
"start":"0",
"limit":"200"}
headers = {"User-Agent":"Mozilla5.0"}
res = requests.get(url,params=params,headers=headers)
res.encoding = "utf-8"
# 得到的json格式的数组[]
html = res.text
# 把json格式的数组转为python的列表
L = json.loads(html)
for film in L:
score = film["rating"][0]
name = film["title"]
with open("豆瓣100.csv","a",newline="") as f:
writer = csv.writer(f)
writer.writerow([name,score])
1.作用:json格式类型 和 Python数据类型 相互转化
2.常用方法
1.json.loads(): json格式 --> Python数据类型
json python
对象 字典
数组 列表
2.json.dumps()
1.定义:Web自动化测试工具,应用于Web自动化测试
2.特点
1.可运行在浏览器上,根据指令操作浏览器,让浏览器自动加载页面
2.只是工具,不支持浏览器功能,只能与第三方浏览器结合使用
3.安装
conda install selenium
pip install seleniu
from selenium import webdriver
1.定义:无界面浏览器(无头浏览器)
2.特点
1.把网站加载到内存执行页面加载
2.运行高效
3.安装
1.Windows
1.把安装包拷贝到 Python 安装路径Scripts...
c:\Python36\Scripts
2.打开终端:phantomjs
2.Ubuntu
1.下载phantomjs安装包放到一个路径下
2.用户主目录:vi .bashrc
export PHANTOM_JS=/home/.../phantomjs-..
export PATH=$PHANTOM_JS/bin:$PATH
3.source .bashrc
4.终端:phantomjs
3.示例
# 导入selenium库中的webdriver
from selenium import webdriver
# 创建打开phantomjs的对象
driver = webdriver.PhantomJS()
# 访问百度
driver.get("http://www.baidu.com/")
# 获取网页截图
driver.save_screenshot("百度.png")
1.driver.get(url)
2.driver.page_source.find("内容")
1.作用:从html源码中搜索字符串
搜索成功:非-1
不成功:-1
3.driver.find_element_by_id("属性值").text
4.driver.find_element_by_name("属性值")
5.driver.find_element_by_class_name("属性值")
6.对象名.send_keys("内容")
7.对象名.click()
8.driver.quit()
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("http://www.baidu.com/")
r1 = driver.page_source.find("kw") # 能找到 17556
r2 = driver.page_source.find("aaaaaaa") # 失败-1
print(r1,r2)
from selenium import webdriver
# 操作键盘鼠标
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.PhantomJS()
driver.get("http://www.baidu.com/")
# 查找搜索框位置
driver.find_element_by_id("kw").send_keys(u"美女")
#driver.save_screenshot("美女.png")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.save_screenshot("搜索.png")
4.案例:登录豆瓣网站
5.案例:斗鱼直播抓取(JS分页加载,动态模拟点击)
1.抓取目标:主播 观众人数
1.主播:span class="dy-name ellipsis fl"
2.人数:span class="dy-num fr"
3.下一页:
能点:a class="shark-pager-next"
不能点:a class="shark-pager-next shark-pager-disable shark-pager-disable-next"
1.定义:HTML或XML的解析器,依赖于lxml库
2.安装并导入
安装:pip install beautifulsoup4
conda install beautifulsoup4
安装模块出错处理
1.conda install selenium --> 报错
卸载:conda uninstall selenium
安装:cmd 右键-->管理员身份打开
python -m pip install selenium
导入模块:from bs4 import BeautifulSoup as bs
3.示例
html="
from bs4 import BeautifulSoup
html = "九宵龙吟惊天变,风云际会浅水游"
# 创建解析对象
soup = BeautifulSoup(html,'lxml')
# 查找div标签的文本
result = soup.div.string
print(result)
4.BeautifulSoup支持解析库
1. lxml HTML解析器 'lxml'速度快,文档容错能力强
2. Python标准库 'html.parser'速度一般
3. lxml XML解析器 'xml' 速度快
import requests
from lxml import etree
import pymongo
class QiuShiSpider:
def __init__(self):
self.url = "https://www.qiushibaike.com/8hr/page/8/"
self.headers = {"User-Agent":"Mozilla5.0"}
self.conn = pymongo.MongoClient("localhost",27017)
self.db = self.conn.BaiKe
self.myset = self.db.baiketab
def getPage(self):
res = requests.get(self.url,headers=self.headers)
res.encoding = "utf-8"
html = res.text
self.parsePage(html)
def parsePage(self,html):
parseHtml = etree.HTML(html)
# 基准xpath,每个段子节点对象的列表
base_list = parseHtml.xpath('//div[contains(@id,"qiushi_tag_")]')
# 遍历每个段子的节点对象
for children in base_list:
# 用户昵称
username = children.xpath('./div/a/h2')[0].text
# 段子内容
content = children.xpath('.//div[@class="content"]/span')[0].text
# 好笑数量
laughNum = children.xpath('.//i')[0].text
# 评论数量
pingNum = children.xpath('.//i')[1].text
d = {"username": username.strip(),
"content" : content.strip(),
"laughNum": laughNum.strip(),
"pingNum" : pingNum.strip()
}
self.myset.insert(d)
if __name__ == "__main__":
spider = QiuShiSpider()
spider.getPage()
from selenium import webdriver
# 操作鼠标键盘
from selenium.webdriver.common.keys import Keys
# 创建phantomjs浏览器对象
driver = webdriver.PhantomJS()
driver.get("https://www.douban.com/")
driver.save_screenshot("豆瓣首页.png")
# 用户名
driver.find_element_by_name("form_email")\
.send_keys("[email protected]")
# 密码
driver.find_element_by_name("form_password")\
.send_keys("zhanshen001")
# 验证码
key = input("请输入验证码:")
driver.find_element_by_id("captcha_field")\
.send_keys(key)
# 登录豆瓣
driver.find_element_by_class_name("bn-submit")\
.click()
driver.save_screenshot("登录成功.png")
driver.quit()
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import time
driver = webdriver.PhantomJS()
driver.get("https://www.douyu.com/directory/all")
while True:
# 创建解析对象
soup = bs(driver.page_source,"lxml")
# 直接调用方法去查找元素
# 存放所有主播的元素对象
names = soup.find_all('span',{"class":"dy-name ellipsis fl"})
numbers = soup.find_all('span',{"class":"dy-num fr"})
# name,number是一个对象,get_text()
for name,number in zip(names,numbers):
print("\t观众人数:",number.get_text().strip(),
"\t主播名字:",name.get_text().strip())
if driver.page_source.find("shark-pager-disable-next") == -1:
driver.find_element_by_class_name("shark-pager-next").click()
time.sleep(4)
else:
break