爬虫基础

验证码识别

使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值