• Python爬虫入门


    爬虫概念&理论基础

    爬虫:从html里面,用循环,快速获取大量信息;

    爬虫爬的都是:非机密信息;只是用循环,批量获取而已;

    爬虫三种方式:

    1)python爬;全部数据在前端dom里面,扒出来我们需要的信息;【lxml里面的etree解析工具、requests:看文档调函数】

    2)nodered爬:比较难用

    3)chrome爬:在F12控制台里面,用JS语法(含正则表达式)剥离出数据;

    爬虫不一定用Python

    用JS、Java等等都可以;

    Python的优势在于:第三方库丰富、上手简单

    爬虫后的处理: 封装+筛选(用正则表达式)+排序

    爬虫攻防战

    恶意爬虫:

    影响网站正常运营:请求资源过多

    反爬虫机制:

    就是人机识别(验证码、滑动条、图片验证)+加密解密

    爬虫难点:

    • 绕过部分反爬虫机制(人机识别+加密解密
    • 编码解码问题(charset / encoding)
    • 多重爬取(打开多个子页面,再爬取)
    • 复杂正则匹配
    • 如果不在前端HTML里面,就要先到Network里面看包的内容
    • 多线程加速爬取

    B站资源:

    【基础txt】

    https://www.bilibili.com/video/BV1ak4y1y7SH?p=1

    【图片批量下载】

    https://www.bilibili.com/video/BV1YL411J7jB?spm_id_from=333.337.search-card.all.click

    详细 教程+案例】

    https://www.bilibili.com/video/BV1i54y1h75W?spm_id_from=333.337.search-card.all.click

    python从页面爬取多个URL,并下载图片

    python读写文件秘籍:https://blog.csdn.net/weixin_41770169/article/details/82963918

    from urllib.request import urlopen
    import re
    import requests
    import numpy
    
    url = "https://www.cnblogs.com/qyf2199/p/12620558.html"
    
    res = urlopen(url)
    ##(1)直接打印 html
    # print(res.read().decode("utf-8"))  # print(res.read())  #decode解码
    ##(2)将html存储为文件
    with open("Data.txt", mode="wb") as f:
        f.write(res.read())  ##这里是写到文件,所以不用解码,要写进去二进制
    
    html = requests.get(url).text
    # print(html)
    
    urls = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', html)
    urls = re.findall('https?://img2020.cnblogs.com/blog/1806053/202004/1806053-\d+-\d+\.png', html)  ##正则化匹配寻找【html】中的【图片url】信息
    print(urls)  ##一次性打印
    numpy.save("URLs", urls)  ##这里是写数组到文件,而不是普通的写入文件,用到numpy包
    ##【从文件里面读取内容】
    ##【1】读取txt
    f = open("Data.txt", "r", encoding="utf-8")  # 设置文件对象
    str0 = f.read()  # 将txt文件的所有内容读入到字符串str中
    f.close()  # 将文件关闭
    # print(str0) ##打印到terminal
    ##【2】读取npy文件
    urls_npy = numpy.load("URLs.npy")
    print(urls_npy)
    
    # 正则获取合适的图片url
    obj = re.compile(r"https?://img2020.cnblogs.com/blog/1806053/202004/1806053-\d+-\d+\.png")  ##正则化匹配有点傻傻的堆砌
    ret = obj.finditer(html)
    i = 0
    for r in ret:
        print(r.group())  ##每个url分别打印
        print("",i,"张图片下载完毕")
        i = i + 1
        pic_name = "C:\\Users\\jinqingyang\\Desktop\\pythonProject\\PythonCrawler\\PNG\\pic_"+str(i)+".png" ##str()用于强制类型转换  ##String之间直接用 +来拼接
        # with open(pic_name, mode="wb")as f:  ##直接保存到相对路径
        with open(pic_name, mode="wb")as f:  ##保存到指定路径
            f.write(requests.get(r.group()).content) ##.content转换为字节码

     采用python带有的并发机制,来提高下载速度:

     将上面代码中的下载部分改为并发机制:

    from concurrent.futures import ThreadPoolExecutor
    
    ## python的并发
    def download_pic(pic_name, r):
        with open(pic_name, mode="wb")as f:
            f.write(requests.get(r.group()).content)
            print(pic_name,"下载完毕")  ##控制台打印进度
    i = 0
    with ThreadPoolExecutor(25) as t:
        for r in ret:
            i = i + 1
            pic_name = "C:\\Users\\jinqingyang\\Desktop\\pythonProject\\PythonCrawler\\PNG\\pic_" + str(i) + ".png"
            t.submit(download_pic,pic_name, r)

     2秒钟就下载完毕了,所有都在同时下载

     

  • 相关阅读:
    jQuery点击事件解绑
    js添加key为数字的对象,通过类似于通过访问数组的中括号形式访问对象属性
    JS区分中英文字符的两种方法: 正则和charCodeAt()方法
    js时间比较,获取n天后(前)的日期
    js延迟函数
    @RequestBody和@ModelAttribute注解
    HttpServletRequest
    java异常处理之throw, throws,try和catch
    js去除空格,判断是否包含
    CSS :focus 选择器
  • 原文地址:https://www.cnblogs.com/qyf2199/p/14186392.html
Copyright © 2020-2023  润新知