验证码识别
使用pytesseract工具
- 验证码识别工具安装
- pip install pytesseract
- pip install pillow
import pytesseract
from PIL import Image
# 读取图片
img = Image.open("./code/mbb5.png")
# 将图片转成灰度图片
img = img.convert("L")
# img.show()
s = pytesseract.image_to_string(img)
print(s)
###使用百度AI工具
from aip import AipOcr
""" 你的 APPID AK SK """
APP_ID = '*****'
API_KEY = '**********'
SECRET_KEY = '***************'
# 创建百度AI的OCR客户端
```python
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('./code/jitang.jpg')
""" 调用通用文字识别, 图片参数为本地图片 """
x = client.basicGeneral(image)
print(x)
image2 = get_file_content('./code/jack.jpg')
x2 = client.basicAccurate(image2)
print(x2)
selenium框架
selenium+phatomjs和selenium+chrome
selenium:是一种用于web程序测试的工具,selenium测试的代码可以直接运行在浏览器中,就像真正的用户操作一样。
在写python爬虫的时候,主要是用selenium的webdriver 来驱动浏览器进行相关的操作
安装:pip install selenium
selenium中元素查找:
find_element_by_id()
find_elements_by_name()
find_elements_by_xpath()
find_elements_by_tag_name()
find_elements_by_class_name()
find_elements_by_css_selector()
find_elements_by_link_text()
事件
click() 点击
send_keys()
switch_to_alert()
chromedriver:谷歌浏览器驱动
加载方法如下:
法一:driver = webdriver.Chrome(r'/Users/fanjianbo/Desktop/chromedriver')
法二:把chromedriver的目录配成环境变量路径,然后:driver = webdriver.Chrome()
【注意】chromedriver的版本要和chrome浏览器相对应,不然很多功能不能用
下载操作谷歌浏览器驱动的页面:http://chromedriver.storage.googleapis.com/index.html 或者 http://npm.taobao.org/mirrors/chromedriver/2.37/
谷歌驱动和谷歌浏览器版本之间的映射表:http://blog.csdn.net/huilan_same/article/details/51896672
phantomjs:无界面浏览器
加载方法如下:
法一:driver = webdriver.PhatomJS("C:\Users\ZBLi\Desktop\1706\day04\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe")
法二:把phantomjs拷贝到c盘下,并把bin目录配置成环境变量,然后driver = webdriver.PhatomJS()
【注意】phantomjs目前已经不再更新
下载地址:http://phantomjs.org/download.html
利用selenium简单操作百度网页
# 从selenium中导入webdriver
from selenium import webdriver
from time import sleep
# 给浏览器添加无头操作
# 创建一个谷歌浏览器的操作对象
opt = webdriver.ChromeOptions()
# 向谷歌浏览器操作对象中添加操作内容
opt.add_argument("--headless") # "--headless"代表无头,即浏览器只提供内核,不提供界面
opt.add_argument("--disable-gpu") # 去掉GPU的调用
# 创建一个谷歌浏览器的驱动
driver = webdriver.Chrome(options=opt)
# 参数executable_path是驱动的路径,这个驱动一旦被创建出来,就会立即打开一个浏览器的窗口以供后期使用
# 参数options,是给当前浏览器加入一些特殊的操作
print(driver) # 现在driver是当前浏览窗口的驱动对象,它就可在当期程序中代表浏览器
# 用用driver发起一个get请求
driver.get(url="https://www.baidu.com/")
# html = driver.page_source
# 用selenium来选择页面上的元素
news = driver.find_element_by_link_text("新闻")
print(news)
input = driver.find_element_by_id("kw")
print(input)
# 点击新闻按钮,进入新闻页面
news.click()
sleep(0.5)
html = driver.page_source
#
# # 搜索新闻
# ww = driver.find_element_by_id("ww")
#
# # 向输入框中输入内容
# ww.send_keys("老王")
# sleep(0.5)
# # 点击百度一下
# driver.find_element_by_id("s_btn_wr").click()
# sleep(5)
# 提取当期页面的html源码
# html = driver.page_source # 这个源码就是经过浏览器对网页源代码解析以后的页面代码
print(html)
# 关闭浏览器
driver.close()
给窗体添加scroll事件
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
url = "https://www.toutiao.com/"
driver.get(url=url)
sleep(3)
# selenium没有原生的下拉操作
# 如果要做下拉刷新,需要用js来操作
# 定义一条js语句,用于操作滚动条滚动
# js = "document.documentElement.scrollTop=100"
# 操作driver来执行js语句
# driver.execute_script(js)
for i in range(100):
distance = i*100
s = "document.documentElement.scrollTop=%d"%distance
print(s)
driver.execute_script(s)
sleep(2)
sleep(5)
driver.close()
bs4网页解析工具
from bs4 import BeautifulSoup
# bs4是一个用于html网页解析的工具,xpath根据节点树来定位节点与属性,bs4是根据标签本身的特性来定位
# 用一个html字符串初始化一个BeautifulSoup对象
soup = BeautifulSoup(open("./soup_test.html","r",encoding="utf-8"),"lxml")
# 参数1,代表一个html字符串 参数2,代表一个解析器,因为bs4本身没有解析器,必须依赖于外界的一个解析器进行解析,也可以不借助于外界解析器,但是解析速度会非常慢
# 1、根据标签名来查找对象
ret = soup.a # 查找出来是页面上的第一个a
ret = soup.li
print(ret)
# 2、获取标签的属性
a = soup.a
print(a.get("href")) # 用get函数来获取属性
print(a["title"]) # 用键值的形式来获取属性
print(a.attrs) # 获取所有的属性
print(a.name)
# 3、获取标签内容
li = soup.li
print(li.string) # string属性可以直接提取标签内部的字符串,如果有注释会自动忽略注释;如果当前标签有2个以上的子标签,将无法用string属性来提取字符串
print(li.get_text()) # 获取当前标签中的所有的文本内容(不包括注释)
# 4、获取子标签
body = soup.body
# 1)获取直接子标签
print(body.children)
# for node in body.children:
# print("=============")
# print(node)
# 2)获取后代标签
print(body.descendants)
# for node in body.descendants:
# print("-------------")
# print(node)
# 5、用相关的函数来获取
# 1)find,找到符合条件的标签中的第一个
a = soup.find("a")
a = soup.find("a",id='hong')
a = soup.find('a',class_='taohua')
print(a)
# 2)findall,找到所有的符合条件的标签
li = soup.find_all("li")
print(li)
# 3)select,根据css选择器来查找
print(soup.select(".cao li"))
简单案例
import json
from time import sleep
import redis
import requests
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver
# url = 'https://category.vip.com/suggest.php?keyword=%E5%8F%A3%E7%BA%A2&page=3'
# res = requests.get(url=url,headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'})
# tree = etree.HTML(res.text)
# tree.xpath("//div[starts-with(@id,'J_pro')]")
#手机口红连衣裙电脑数据线每个产品前10页
#下载模块
def request_data(goods_list,url):
#创建无头操作
# opt = webdriver.ChromeOptions()
# opt.add_argument("--headless")
# opt.add_argument("--disable-gpu")options=opt
#创建一个driver
driver = webdriver.Chrome()
#遍历goods_list
for goods in goods_list:
for page in range(1,11):
page_url = url%(goods,page)
#用driver发请求
driver.get(page_url)
sleep(1)
#下拉加载
for i in range(30):
js = "document.documentElement.scrollTop=%d"%(i*100)
print("商品:%s,第%d页,正在进行%d次下拉加载..."%(goods,page,i+1))
driver.execute_script(js)
sleep(0.5)
html = driver.page_source
yield html
#【解析】
def analysis_data(data):
for html in data:
#创建BeautifulSoup对象
soup = BeautifulSoup(html,'lxml')
#获取每个商品
goods_list = soup.select(".goods-list-item")
for goods in goods_list:
#用goods来做内部选择
item = {}
item["title"] = goods.select(".goods-title-info a")[0].get_text()
item["disprice"] = goods.select(".inner-exclusive > .title ")[0].get_text()
item["sellprice"] = goods.select(".goods-sells-price > .price ")[0].get_text()
item["smallprice"] = goods.select(".goods-market-price")[0].get_text()
item["discount"] = goods.select(".vipshop-discount")[0].get_text()
#价格(原价,市场价,疯抢价)存入redis数据库
# print(item)
yield item
def write_to_redis(data):
rds = redis.StrictRedis(host="127.0.0.1",port=6379,db=1)
for item in data:
rds.lpush("goodsinfo",json.dumps(item)
if __name__ == '__main__':
url = "https://category.vip.com/suggest.php?keyword=%s&page=%d"
goods_list = ["手机","口红"]
html = request_data(url=url,goods_list=goods_list)
goods_infos = analysis_data(html)
write_to_redis(goods_infos)